加入Netezza的类型

use*_*155 1 join netezza

我无法在Netezza/PureData中获得正式的联接类型列表.

根据我读过的powerpoint演示文稿,有5种类型:

  1. 散列连接:需要等同条件,相同类型.最快的
  2. 存在加入:一种哈希加入?
  3. 表达式连接:也称为嵌套循环连接?
  4. 合并连接:它们是否合并了排序连接?有些文章提到的就像Hash Joins,但是对于花车来说
  5. 交叉产品加入:慢?

正如你所看到的,我有很多知识空白.不幸的是,我还没有找到涵盖这个主题的综合文档.对此的任何意见将不胜感激.

Sco*_*McG 6

这是我的回答.我认为考虑它的最佳方式是考虑如何在SQL中表达连接,然后考虑数据库使用的连接算法来解决它们.


等值连接

这种形式的连接,其中连接标准是相等比较,并且每个术语是一个简单的列引用(即不是表达式).

SELECT ...
FROM tableA a
   JOIN tableB b
   ON a.col1 = b.col
Run Code Online (Sandbox Code Playgroud)

算法

Netezza最常使用散列连接方法解析Equi-joins ,其中可以比较连接列的散列值以验证相等性.

在某些情况下,Netezza可能会使用合并排序连接方法,以便连接的数据已经排序(例如使用物化视图),这使得这种通常昂贵的方法更具吸引力,或者当比较的数据类型使哈希比较为不可靠(例如浮点数据类型).


表达式加入

这种形式的连接,其中连接标准是除了相等比较之外的任何东西.

SELECT ...
FROM tableA a
   JOIN tableB b
   ON a.col1 < b.col
Run Code Online (Sandbox Code Playgroud)

算法

由于简单的等式评估是不够的,Netezza使用嵌套循环方法处理这些情况.tableA中的每一行都针对tableB中的每一行进行单独计算.因此,表达式连接永远不能成为Netezza中的共存连接.因此嵌套循环方法非常昂贵.


交叉连接

此表单的连接,其中连接条件不包括来自至少一个表的任何列.

SELECT ...
FROM tableA a
   JOIN tableB b
   ON a.col1 = 0
Run Code Online (Sandbox Code Playgroud)

或SELECT ... FROM tableA a,tableB b

算法

Netezza将采用cartesion产品方法来解决这些问题,这可能非常昂贵,并且也不能是共同定位的连接,因为每个数据切片中的每一行必须连接到每个其他数据切片中的每一行.


隐含IN/EXISTS连接

诸如此类的语句不是SQL中的显式连接,但可以作为数据库的连接进行处理.

SELECT ...
FROM tableA a
WHERE col1 IN
   (
      SELECT col1
      FROM tableB
   )
Run Code Online (Sandbox Code Playgroud)

要么

SELECT ...
FROM tableA a
WHERE NOT EXISTS
   (
      SELECT *
      FROM tableB b
      WHERE a.col1 = b.col1
   )
Run Code Online (Sandbox Code Playgroud)

算法

Netezza将使用Exists Join方法处理这些语句,这与Hash Join方法基本相同,但由于结果集中不需要连接数据,因此它只需要在流程中存在.