我试图理解为什么此查询不使用索引:
SELECT
te.idturno
FROM turno t
JOIN turnoestado te ON t.idturno = te.idturno
ORDER BY te.idturno, te.idturnoestado
Limit 100
Turno表的行数约为100万,而TurnoEstado的行数约为1000万。
以下是索引定义:
CREATE INDEX idx_turnoestado_idturno
ON turnoestado USING btree (idturno);
CREATE INDEX idx_turnoestado_idturnoestado
ON turnoestado USING btree (idturnoestado);
正如您所看到的,Order By子句中使用的键有两个索引,但根据explain analyze返回的查询计划,它们都没有使用:
Limit (cost=988700.56..988700.81 rows=100 width=8) (actual time=7332.740..7332.754 rows=100 loops=1)
-> Sort (cost=988700.56..1014125.36 rows=10169918 width=8) (actual time=7332.737..7332.746 rows=100 loops=1)
Sort Key: te.idturno, te.idturnoestado
Sort Method: top-N heapsort Memory: 29kB
-> Hash Join (cost=160603.86..600013.61 rows=10169918 width=8) (actual time=505.221..6279.233 rows=10169918 loops=1)
Hash Cond: (te.idturno = t.idturno)
-> Seq Scan on turnoestado te (cost=0.00..178003.18 rows=10169918 width=8) (actual time=0.011..1249.563 rows=10169918 loops=1)
-> Hash (cost=143894.94..143894.94 rows=1018394 width=4) (actual time=504.731..504.731 rows=1018394 loops=1)
Buckets: 4096 Batches: 64 Memory Usage: 571kB
-> Seq Scan on turno t (cost=0.00..143894.94 rows=1018394 width=4) (actual time=0.033..342.071 rows=1018394 loops=1)
Total runtime: 7332.824 ms
如果我在Order By中只使用一个键,结果是瞬时的,如果我创建一个多列索引,也会发生同样的情况。为什么规划人员不使用已创建的索引?。
PS:我在x86_64-unknown-linux-gnu上使用&#34; PostgreSQL 9.3.5,由gcc编译(Ubuntu 4.8.2-19ubuntu1)4.8.2,64位&#34; < / p>