2015-02-10 40 views
1

我知道托管对于Netezza中的分布式连接很重要。在高层次上,它具有以下定义:Netezza - 在SQL的角度来看,什么是主机托管?

All data for joins are located in the same SPU 

我也谈到了一些Netezza公司员工在过去,他们提到,加入被视为同一地点,如果所有表分发和加入相同的列。

不过,我还是觉得这个定义有点欠缺......根据我的理解1相和2相GROUP BY的,我怀疑真的托管运行在如下的定义:

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的建议下,我重新的定义,同位为加盟:

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 

回答

1

对于Netezza公司,一个连接被认为是当涉及到连接表不需要从数据切片上,他们长期居住,以便进行重新分配加盟或广播来协同定位。

如果这只能发生:

  • 集由加入所需的列都列在每个表
  • 每个表参与加盟的分布键的超集具有相同作为分配键的一组列。
  • 该连接是一个等连接。

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

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

关于连接类型的影响,equijoins将是这种形式。请注意,这可能是哈希连接或合并排序连接(如果数据类型可能是浮点)。无论哪种情况,我们都不需要重新分配数据。在这些例子中,两个表都分布在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 
+0

我明白了。所以我提出的定义是要求#1。在#2上,如果表A分布在A.CustomerName上,则表B分布在CardholderName上,并且我们在A.CustomerName = B.CardholderName上有Join。我认为那不会是共同本地化的。那么认为“同一”专栏的一种方式是,条件必须使得LHS和RHS必须具有PK-FK关系或两者都是FK指向相同的PK?至于要求3,这是我第一次看到它提到。我知道这是HASH JOIN所必需的。那么我可以假设共位联接的前提条件是它必须是HASH吗? – user1836155 2015-02-10 21:41:54

+1

我认为,我编辑了我的回复,以澄清这一点,就像您发表评论一样。对于#2,只有列中的内容散列为相同的值才是重要的。因此,对于“表A分布在A.CustomerName上,表B分布在CardholderName上,并且我们在A.CustomerName = B.CardholderName上有联合”,只要CustomerName和CardholderName都是varchar,那么您可以有一个共同连接,因为两者中的“SMITH”都会哈希到相同的值。对于#3,让我补充更多的答案来澄清。 – ScottMcG 2015-02-10 21:53:52

+1

有趣。因此,让我尝试对协作需求做一个简单的形式化:(1)JOIN必须是HASH/MERGE SORT JOIN,并且(2)连接所需的一组列必须是每个表的分配键。至于JOIN类型,是否有一个页面能够很好地满足他们的需求和性质?我唯一能找到的就是HASH JOIN需要等号和相同类型,EXIST JOIN是一种特殊类型的HASH JOIN,而NESTED LOOP JOIN是baddddd。如果有必要,我可以提出一个新的问题 – user1836155 2015-02-10 22:55:37

相关问题