Sql 不使用索引postgres更新

Sql 不使用索引postgres更新,sql,postgresql-9.2,Sql,Postgresql 9.2,我正在尝试优化一个查询。我正在更新的表vwml_premelissa有3.5mil记录。我还有第二个表(50k条记录),指定哪些记录需要更新 vwml_premelissa的“vin”列上有一个唯一索引 查询 update extras.vwml_premelissa set suppress = 'THREE' where vin in (select vin from extras.vwml_threes) 在我的开发箱上花了一个多小时。当我解释我得到的问题时 Update o

我正在尝试优化一个查询。我正在更新的表vwml_premelissa有3.5mil记录。我还有第二个表(50k条记录),指定哪些记录需要更新

vwml_premelissa的“vin”列上有一个唯一索引

查询

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进行序列扫描,而不是使用索引来定位需要更新的记录


postgres 9.2 windows

我不是数据库管理系统专家,我在PostgreSQL上花了几年时间,但在一些RDBMS中,如果引擎认为无论如何都必须执行表扫描,查询并不总是使用索引。例如,如果
vwml\u threes
具有较高的基数,并且有许多行类似于
vwml\u premelissa
中的行,那么引擎可能会决定执行表扫描的效率与尝试对
vwml\u threes
中的每个记录执行索引查找的效率相同

您可以尝试包括其他条件,例如按日期分块,然后在这些分块上迭代,直到完整更新完成。显然,如果您希望看到性能提高,那么这些条件也需要索引,因此您的总查询成本将包括添加缺少的索引,这对于一次性查询可能没有意义


我很想知道这种解释是否适用于PostgreSQL——很可能我弄错了。

您的统计数据是最新的(
分析
)?您也可以尝试加入,而不是
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)