从其他表更新值对大型数据集而言代价昂贵

时间:2019-07-08 16:11:33

标签: sql postgresql sql-update

我有一个包含700万行的表(表1),我需要将该表中的一个值复制到另一个表(表2)中的列中。我试图在只有50行的示例表上执行此操作,这非常昂贵(22秒)。我想念什么吗?这是一个相对简单的操作,我无法花数小时/天来运行。

postgres=# explain analyze update table2 set myvalue=(SELECT myvalue from table1 t1 where table2.id=t1.id);

查询计划

 Update on table2  (cost=0.00..14291311.70 rows=130 width=586) (actual time=22074.702..22074.702 rows=0 loops=1)
   ->  Seq Scan on table2  (cost=0.00..14291311.70 rows=130 width=586) (actual time=407.754..22073.606 rows=50 loops=1)
         SubPlan 1
           ->  Seq Scan on table1 t1  (cost=0.00..109933.08 rows=4836 width=32) (actual time=264.664..441.460 rows=1 loops=50)
                 Filter: (table2.id = (id)::text)
                 Rows Removed by Filter: 737957
 Planning time: 0.110 ms
 Execution time: 22074.747 ms

2 个答案:

答案 0 :(得分:1)

带有联接的UPDATE,通常更快:

update table2 
  set myvalue = t1.myvalue
from table1 t1 
where table2.id=t1.id;

答案 1 :(得分:0)

更新所有行将非常昂贵。但是,对于此查询:

update table2
    set myvalue = (SELECT myvalue from table1 t1 where table2.id = t1.id);

您进行了大量扫描。索引会有所帮助,特别是在table1(id, myvalue)上。