我有一个与Netezza
查询性能相关的问题。我有2个表,表A和表B,表B是表A的子集,带有数据更改。我需要将这些新值更新到表A来自表B.
我们可以有两种方法
1)左外连接并选择相关列并插入目标表
2)将数据表插入目标表,并使用join
从tableB更新这些值我尝试了两者,逻辑上两者都是一样的。但是解释计划给出了不同的成本
正常选择
一)Sub-query Scan table "TM2" (cost=0.1..1480374.0 rows=8 width=4864 conf=100)
更新
B)Hash Join (cost=356.5..424.5 rows=2158 width=27308 conf=21)
Sub-query Scan table "TM2" (cost=51.0..101474.8 rows=10000000 width=4864 conf=100)
从此我感觉左外连接更好。任何人都可以对此进行一些思考并指导
由于
答案 0 :(得分:0)
insert into table_c select ... from table_a; update table_c set ... from table_b;
的成本较高的原因是因为您正在插入,删除,然后插入。 Netezza中的更新将要更新的记录标记为已删除,然后插入具有更新值的新行。一旦数据被写入一定程度,它就永远不会(据我所知)改变。
使用insert into table_c select ... from table_a join table_b using (...);
,您只需插入一次,因此只会更新所有区域地图一次。成本将明显降低。
Netezza在读取时能够让您远离磁盘,但它会像您告诉的那样经常写入磁盘。在更新的情况下,看起来更是如此。尽可能经常地编写以获得新发行版和共同联接的好处。除此之外,您只是使用了多余的提交操作。