我有一个包含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
答案 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)
上。