我有疑问:
EXPLAIN ANALYSE
SELECT * FROM "order_bt" o
LEFT JOIN agreement a ON a.id = o.agreement_id
两个表都有索引:
"order_idx_agreement_id" btree (agreement_id)
"agreement_pkey" PRIMARY KEY, btree (id)
但是explain analyse
说Seq Scan on agreement a
。 为什么?
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Hash Left Join (cost=36.97..199.70 rows=3702 width=193) (actual time=0.961..8.422 rows=3702 loops=1)
Hash Cond: (o.agreement_id = a.id)
-> Seq Scan on order_bt o (cost=0.00..116.02 rows=3702 width=136) (actual time=0.025..3.566 rows=3702 loops=1)
-> Hash (cost=22.54..22.54 rows=1154 width=57) (actual time=0.912..0.912 rows=1154 loops=1)
Buckets: 2048 Batches: 1 Memory Usage: 104kB
-> Seq Scan on agreement a (cost=0.00..22.54 rows=1154 width=57) (actual time=0.019..0.397 rows=1154 loops=1)
Planning time: 0.785 ms
Execution time: 8.886 ms
(8 rows)
答案 0 :(得分:3)
只有〜1000行,您正在选择所有列。如果确实使用了索引,则必须返回表以获取其余数据。对于这么小的表,只扫描整个内容会更快,尤其是因为看起来您无论如何都在选择协议表的每一行和每一列。
答案 1 :(得分:2)
哈希联接不利用索引,它们顺序扫描两个关系。
只有嵌套循环联接和合并联接才能在联接列上使用索引。
PostgreSQL刚刚决定使用索引效率不高,因为哈希联接是最快的方法。由于估算是准确的,因此可能做出了正确的决定。
如果表保持很小并且您不需要其他用途,则可以删除索引。