【发布时间】: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 万数据