【发布时间】:2014-04-15 20:04:53
【问题描述】:
我正在尝试优化查询。我正在更新的表 vwml_premelissa 有 350 万条记录。我有第二个表(50k 记录),它指定需要更新哪些记录。
“vin”列上的 vwml_premelissa 有一个唯一索引。
CREATE UNIQUE INDEX pkey_vwml_premelissa
ON extras.vwml_premelissa
USING btree
(vin COLLATE pg_catalog."default");
查询...
update extras.vwml_premelissa
set suppress = 'THREE' where vin in (select vin from extras.vwml_threes)
在我的开发盒上花费了一个多小时。当我对查询进行解释时,我得到了
Update on vwml_premelissa (cost=1837.07..412393.58 rows=52892 width=182)
-> Hash Semi Join (cost=1837.07..412393.58 rows=52892 width=182)
Hash Cond: ((vwml_premelissa.vin)::text = (vwml_threes.vin)::text)
-> Seq Scan on vwml_premelissa (cost=0.00..219004.32 rows=3685132 width=176)
-> Hash (cost=865.92..865.92 rows=52892 width=24)
-> Seq Scan on vwml_threes (cost=0.00..865.92 rows=52892 width=24)
为什么 postgres 坚持对 vwml_premelissa 进行 seq 扫描,而不是使用索引来定位它需要更新的记录?
postgres 9.2 窗口
【问题讨论】:
-
您的统计数据是最新的吗 (
analyze)?您也可以尝试加入而不是IN
标签: sql postgresql-9.2