加入 Netezza 类型
Join types of Netezza
我在 Netezza/PureData 中获取正式的连接类型列表时遇到问题。
根据我阅读的 powerpoint 演示文稿,有 5 种类型:
- Hash Join:要求条件相同,类型相同。最快
- 存在连接:一种哈希连接?
- 表达式连接:也称为嵌套循环连接?
- 合并联接:它们是合并排序联接吗?一些文章提到它类似于 Hash Joins 但对于 floats
- 跨产品连接:慢?
如您所见,我有很多知识空白。不幸的是,我还没有找到涵盖该主题的全面文档。如有任何意见,我们将不胜感激。
这是我的回答。我认为考虑它的最佳方式是考虑连接如何在 SQL 中表示,然后考虑数据库使用的连接算法来在幕后解析它们。
等值连接
这种形式的联接,其中联接条件是相等比较,每个术语都是简单的列引用(即不是表达式)。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 = b.col
算法
Netezza 最常使用 Hash Join 方法解析等值连接,其中可以比较连接列的散列值以验证相等性。
在某些情况下,Netezza 可能会使用 Merge Sort Join 方法,以防被连接的数据已经排序(例如使用实体化视图),从而使这种通常昂贵的方法更具吸引力,或者当被比较的数据类型使得散列比较不可靠时(例如浮点数据类型)。
表达式连接
这种形式的联接,其中联接条件不是相等比较。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 < b.col
算法
由于简单的相等性评估是不够的,Netezza 使用嵌套循环 方法处理这些情况。 tableA 中的每一行都针对 tableB 中的每一行进行单独评估。正是由于这个原因,表达式连接永远不能成为 Netezza 中的并置连接。因此,嵌套循环方法非常昂贵。
交叉连接
这种形式的联接,其中联接条件不包括来自 table.
中至少一个的任何列
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 = 0
或
SELECT ...
来自 tableA a,
table乙乙
算法
Netezza 将采用笛卡尔乘积方法来解决这些问题,这可能非常昂贵,而且也不能是共址联接,因为每个数据切片中的每一行都必须联接到每个其他数据切片中的每一行。
隐式 IN/EXISTS 加入
诸如此类的语句在 SQL 中不是显式连接,但可能会被数据库处理为连接。
SELECT ...
FROM tableA a
WHERE col1 IN
(
SELECT col1
FROM tableB
)
或
SELECT ...
FROM tableA a
WHERE NOT EXISTS
(
SELECT *
FROM tableB b
WHERE a.col1 = b.col1
)
算法
Netezza 将使用 Exists Join 方法处理这些语句,这与 Hash Join 方法基本相同,但由于结果集中不需要连接数据,因此它只需统计进程中的存在即可。
我在 Netezza/PureData 中获取正式的连接类型列表时遇到问题。
根据我阅读的 powerpoint 演示文稿,有 5 种类型:
- Hash Join:要求条件相同,类型相同。最快
- 存在连接:一种哈希连接?
- 表达式连接:也称为嵌套循环连接?
- 合并联接:它们是合并排序联接吗?一些文章提到它类似于 Hash Joins 但对于 floats
- 跨产品连接:慢?
如您所见,我有很多知识空白。不幸的是,我还没有找到涵盖该主题的全面文档。如有任何意见,我们将不胜感激。
这是我的回答。我认为考虑它的最佳方式是考虑连接如何在 SQL 中表示,然后考虑数据库使用的连接算法来在幕后解析它们。
等值连接
这种形式的联接,其中联接条件是相等比较,每个术语都是简单的列引用(即不是表达式)。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 = b.col
算法
Netezza 最常使用 Hash Join 方法解析等值连接,其中可以比较连接列的散列值以验证相等性。
在某些情况下,Netezza 可能会使用 Merge Sort Join 方法,以防被连接的数据已经排序(例如使用实体化视图),从而使这种通常昂贵的方法更具吸引力,或者当被比较的数据类型使得散列比较不可靠时(例如浮点数据类型)。
表达式连接
这种形式的联接,其中联接条件不是相等比较。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 < b.col
算法
由于简单的相等性评估是不够的,Netezza 使用嵌套循环 方法处理这些情况。 tableA 中的每一行都针对 tableB 中的每一行进行单独评估。正是由于这个原因,表达式连接永远不能成为 Netezza 中的并置连接。因此,嵌套循环方法非常昂贵。
交叉连接
这种形式的联接,其中联接条件不包括来自 table.
中至少一个的任何列SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 = 0
或 SELECT ... 来自 tableA a, table乙乙
算法
Netezza 将采用笛卡尔乘积方法来解决这些问题,这可能非常昂贵,而且也不能是共址联接,因为每个数据切片中的每一行都必须联接到每个其他数据切片中的每一行。
隐式 IN/EXISTS 加入
诸如此类的语句在 SQL 中不是显式连接,但可能会被数据库处理为连接。
SELECT ...
FROM tableA a
WHERE col1 IN
(
SELECT col1
FROM tableB
)
或
SELECT ...
FROM tableA a
WHERE NOT EXISTS
(
SELECT *
FROM tableB b
WHERE a.col1 = b.col1
)
算法
Netezza 将使用 Exists Join 方法处理这些语句,这与 Hash Join 方法基本相同,但由于结果集中不需要连接数据,因此它只需统计进程中的存在即可。