netezza离开了外连接查询性能

时间:2015-06-17 13:15:01

标签: netezza explain

我有一个与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)

从此我感觉左外连接更好。任何人都可以对此进行一些思考并指导

由于

1 个答案:

答案 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在读取时能够让您远离磁盘,但它会像您告诉的那样经常写入磁盘。在更新的情况下,看起来更是如此。尽可能经常地编写以获得新发行版和共同联接的好处。除此之外,您只是使用了多余的提交操作。