2015-02-10 39 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

相關問題