netezza 左外连接查询性能
Posted
技术标签:
【中文标题】netezza 左外连接查询性能【英文标题】:netezza left outer join query performance 【发布时间】:2015-06-17 13:15:01 【问题描述】:我有一个与Netezza
查询性能有关的问题。我有 2 个表 A 和 B 表,表 B 是表 A 的子集,具有数据更改。我需要将这些新值从表更新到表 A乙
我们可以在这里有两种方法
1) 左外连接并选择相关列并插入到目标表中
2) 将表a数据插入目标表并使用join更新tableB中的这些值
我都试过了,逻辑上都是一样的。但是解释计划给出不同的成本
普通选择
a)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)
从这里我觉得左外连接更好。任何人都可以对此有所思考并指导
谢谢
【问题讨论】:
你能澄清一下“目标表”是什么吗?从您的前几条语句来看,您似乎正在尝试从某些表 B 的值更新某些表 A。是这样吗?如果是,则您的两个选项不等效。您说的是选项 1 中的纯插入以及选项 2 中的插入和更新(既是插入又是删除)。显然,选项 2 会花费更多。 了解每个表的大致行数和分布列数也会有所帮助。 大家好,在这两种情况下,我们都需要插入到目标表中。在第一种情况下,表 a 左外连接表 b 并插入表 c。第二种情况直接从表 a 插入表 c 并使用表 B 更新。希望现在很清楚。关于行数我们不能画线。表 B 将是表 A 的子集,在最坏的情况下最大行数(1000 万)因为 Insert 包含 Group BY 并且有 Filter 表 C 不会跨越 100 万数据 【参考方案1】: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 在让您远离磁盘进行读取方面做得非常出色,但它会根据您的要求频繁地写入磁盘。在更新的情况下,似乎更是如此。尽量只写必要的频率,以获得新发行版和并置连接的好处。不仅如此,而且您只是在使用过多的提交操作。
【讨论】:
感谢您的回答。我发布查询计划标题只是因为正常选择显示更多成本(子查询扫描表“TM2”(成本=0.1..1480374.0 行=8 宽度=4864 conf =100)) 与左外连接相比(子查询扫描表“TM2”(成本=51.0..101474.8 行=10000000 宽度=4864 conf=100))。可能是我没有正确查看成本。纠正我如果我错了以上是关于netezza 左外连接查询性能的主要内容,如果未能解决你的问题,请参考以下文章