1. 程式人生 > >[轉]Greenplum 執行計劃之廣播與重分布

[轉]Greenplum 執行計劃之廣播與重分布

一個 .cn 字段id 實戰 移動 選擇 得到 不同 由於

關聯數據在不同節點上,對於普通關系型數據庫來說,是無法進行連接的。關聯的數據需要通過網絡流入到一個節點中進行計算,這樣就需要發生數據遷移。數據遷移有廣播和重分布兩種。在GP中,每一個廣播或重分布會產生一個切片,每一個切片在每個數據節點上都會對應發起一個進程來處理該slice負責的數據,上一層負責該slice的進程會讀取下級slice廣播或重分布的數據,然後進行相應的計算。

當兩張表關聯的時候,如果有一張表的關聯鍵不是分布鍵,那麽就會發生表的廣播或者重分布,將數據移動到一個節點上進行關聯,從而獲得數據。
分布式的關聯有兩種:
單庫關聯:關聯鍵與分布鍵一致,只需要但單個庫關聯後得到結果即可。
跨庫關聯:關聯鍵與分布鍵不一致,數據需要重新分布。轉換成單庫關聯,從而實現表的關聯。

表關系如下:

表A
字段:id,id2
分布鍵:id
數據量:M

表B
字段:id,id2
分布鍵:id
數據量:N

內連接

情況1:

select * from A,B where A.id=B.id;
分布鍵與關聯鍵相同,屬於單庫關聯,不會造成廣播或者重分布。

情況2:

select * from A,B where A.id=B.id2;
表A的關聯鍵是分布鍵,表B的關聯鍵不是分布鍵,那麽可以通過兩種凡是來實現關聯。
1. 將表B按照id2字段將數據重分布到一個節點上,然後再與表A進行關聯。重分布的數據量是N。
2. 將表A廣播,每一個節點都放一份全量數據,然後再與表B關聯得到結果。廣播的數據量是M*節點數。

所以,當N>M*節點數的時候,選擇表A廣播,否則選擇B重分布。

情況3:

select * from A,B where A.id2=B.id2;
兩個表的關聯鍵與分布鍵都不一樣,那麽還有兩種做法:
1. 將表A與表B按照id2字段,將數據重分布到每個節點,重分布的代價是M+N。
2. 將其中一張表廣播後再關聯,當然選取小表廣播,代價小。廣播的代價是min(M,N)*節點數。
所以當M+N>min(M,N)*節點數的時候,選擇小表廣播,否則選擇兩個表都重分布。

左連接

情況1:

select * from A left join B on A.id=B.id;
單庫關聯,不涉及數據庫跨庫關聯。

情況2:

select * from A left join B on A.id=B.id2;
由於左表的分布鍵是關聯鍵,鑒於左連接的性質,無論表B數據量多大,都必須將表B按照字段id2重分布數據。

情況3:

select * from A left join B on A.id2=B.id;
左表的關聯鍵不是分布鍵,由於左連接A表肯定不是被廣播的,所以有兩種方式。
1. 將表A按照id2重分布數據,轉換成情況A,代價為M。
2. 將表B廣播,代價為N*節點數。

情況4:

select * from A left join B on A.id2=B.id2;
有兩種處理方式。
1. 將表A與表B都按照id2字段將數據重分布一遍以,轉換成情況1,代價是M+N。
2. 表A不能被廣播,只能將表B廣播,代價是N*節點數。

全連接

情況1:

select * from A full outer join B on A.id=B.id;

關聯鍵是分布鍵,在GP中全連接只能采用Merge Join來實現。

情況2:

select * from A full outer join B on A.id=B.id2;
將不是關聯鍵不是分布鍵的表重分布數據,轉換成情況1解決。無論A、B大小分別為多少,為了實現全連接,不能講表廣播,只能是重分布。

情況3:

select * from A full outer join B on A.id2=B.id2;
將兩張表都重分布,轉換成情況1進行處理。

《Greenplum企業應用實戰》

(原文地址:http://www.jpblog.cn/greenplum-%E6%89%A7%E8%A1%8C%E8%AE%A1%E5%88%92%E4%B9%8B%E5%B9%BF%E6%92%AD%E4%B8%8E%E9%87%8D%E5%88%86%E5%B8%83.html)

[轉]Greenplum 執行計劃之廣播與重分布