1

我知道托管对于 Netezza 中的分布式连接很重要。在高层次上,它具有以下定义:

All data for joins are located in the same SPU

过去我还与一些 Netezza 员工交谈过,他们提到如果所有表在相同的列上分布和连接,则连接被认为是共置的。

但是,我仍然觉得定义有点欠缺……根据我对 1-phase 和 2-phase GROUP BY 的理解,我怀疑 colocation 确实在以下定义上运行:

A join is considered colocated if the set of columns used in the join condition is a superset of the distribution keys of all participating tables.

这是一个正确的定义吗?我尝试在新西兰寻找一个准确的托管定义,但我得到的只是一堆假设你已经知道定义的文章。

对此的输入将不胜感激。谢谢!

编辑:根据 ScottMcG 的建议,我将 colocated join 的定义重新表述为:

1. It must be a HASH or MERGE SORT JOIN
2. Set of columns in join conditions must be superset of all distribution keys of all participating tables
3. ?

这 ?#3 的标记是我需要解决的模棱两可的问题。根据 ScottMcG 的说法,每个表的分布键也必须相互连接。

假设表 A、B、C 分布在文本列 A.C1、A.C2、B.C3、B.C4、C.C5 和 C.C6 上,我们有以下连接。

SELECT * FROM A 
    INNER JOIN B "Join1"
        ON A.C1=B.C3
    INNER JOIN C "Join2"
        ON A.C2=B.C4
        AND A.C2=C.C6
        AND [X]

现在,让我们提供一些 [X] 的可能定义。那么对于 [X] 的哪些定义将 Join2 并置?

(1) [X] = A.C2 = 5

(2) [X] = A.C2 = B.C1 OR A.C2 = C.C5

(3) [X] = A.C1 IS NULL

(4) [X] = A.NonKeyColumn1 = B.NonKeyColumn2
4

1 回答 1

1

对于 Netezza,当连接中涉及的表不需要从它们永久驻留的数据片重新分配或广播以执行连接时,连接被认为是共置的。

只有在以下情况下才会发生这种情况:

  • 连接所需的一组列是每个表的分布键中的列的超集
  • 参与连接的每个表都具有与其分布键相同的列集。
  • 该联接是等值联接。

这些条件与您在定义中建议的条件非常接近,并且是允许但不足以确保同地连接的必要条件。优化器可能会决定预先广播其中一个表,如果它足够小,即使它们分布在相同的列上,那么从技术上讲,这将不是一个同位连接。

我应该补充的一个警告是,对于被认为与另一列“相同”的列,列值应该散列到相同的值。一般来说,这意味着列数据类型是相同的。一个例外是整数系列数据类型(byteint、smallint、int、bigint)只要在支持的范围内,就会散列到相同的值。

关于连接类型的效果,等连接将是这种形式。请注意,这可能是哈希连接或归并排序连接(如果数据类型可能是浮点数)。无论哪种情况,我们都不需要重新分配数据。在这些示例中,两个表都分布在 COL1 上。

SELECT ...
FROM TableA A
   JOIN TableB B
   ON A.COL1 = B.COL1

如果连接是基于表达式的连接,如下所示,那么您最终将重新分配或广播数据。对于“小于”连接,您必须能够确定 8 小于 9,但由于它们都将被散列到不同的数据切片,因此只有在将一个重定位到另一个时才能比较它们。

SELECT ...
FROM TableA A
   JOIN TableB B
   ON A.COL1 < B.COL1

SELECT ...
FROM TableA A
   JOIN TableB B
   ON A.COL1 -  B.COL1 = 0
于 2015-02-10T20:20:27.447 回答