我无法在Netezza / PureData中获取正式的联接类型列表。
根据我读过的powerpoint演示文稿,有5种类型:
正如你所看到的,我有很多知识空白。不幸的是,我还没有找到涵盖这个主题的综合文档。对此的任何意见都将不胜感激。
答案 0 :(得分:6)
这是我的回答。我认为考虑它的最佳方式是考虑如何在SQL中表达连接,然后考虑数据库使用的连接算法来解决它们。
<强>相等联接强>
此表单的连接,其中连接条件是相等比较,并且每个术语都是一个简单的列引用(即不是表达式)。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 = b.col
算法
Netezza最常使用散列连接方法解析Equi-joins,可以比较连接列的散列值以验证是否相等。
在某些情况下,Netezza可能会使用合并排序加入方法,以便加入的数据已经排序(例如使用物化视图),这使得这种通常很昂贵的方法更具吸引力,或者数据时被比较的类型使得散列比较不可靠(例如,浮点数据类型)。
表达式加入
此表单的连接,其中连接条件不是相等比较。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 < b.col
算法
由于简单的等式评估还不够,Netezza使用嵌套循环方法处理这些情况。 tableA中的每一行都针对tableB中的每一行进行单独计算。因此,表达式连接永远不能成为Netezza中的共存连接。因此,嵌套循环方法非常昂贵。
交叉加入
此表单的连接,其中连接条件不包括来自至少一个表的任何列。
SELECT ...
FROM tableA a
JOIN tableB b
ON a.col1 = 0
或 选择 ... 来自tableA a, tableB b
算法
Netezza将采用cartesion产品方法来解决这些问题,这可能非常昂贵,而且也不能是共同定位的连接,因为每个数据切片中的每一行都必须连接到每个其他数据切片中的每一行。
隐含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方法基本相同,但由于结果集中不需要连接数据,因此只需要计算存在在这个过程中。