Postgresql索引未使用

时间:2014-12-30 13:04:46

标签: postgresql

我试图理解为什么此查询不使用索引:

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>

0 个答案:

没有答案