greenplum 兩表關聯 重分布 廣播

2021-09-22 09:24:45 字數 1550 閱讀 6643

假設需要兩張表a,b關聯,其中a表中關聯鍵不是分布鍵,那麼對於a表而言就會發生如下兩種情況

1 廣播

2  重分布

分布式的關聯有兩種

單庫關聯:分布鍵和關聯鍵一致,只需要在單個庫關聯後得到結果即可

跨庫關聯:關聯鍵和分布鍵不一致,資料重新分布,轉換為單庫關聯,從而實現表的關聯

測試表

表名 字段 分布鍵

數量 a

id1,id2

id1

m b

id1,id2

id1 n

考慮幾種連線方式

內連線

1、分布鍵與關聯鍵一致,單庫連線

select * from a,b where a.id1=b.id1;

2、一張表的分布鍵與關聯鍵不一致

select * from a,b where a.id1 = b.id2;

首先第一點b表分布鍵與關聯鍵不一致

考慮 將 b 表按照 id2 重分布一遍則資料量為n

(其實還可以將b表廣播z份,資料量為n*z,所以就可以判斷出,b表最多重分布)

將a廣播z份,則資料為m*z

就是要比較兩者產生的資料量大小,如果b大,則讓a廣播,如果b小,則rang b重分布

3、兩張表的分布鍵與關聯鍵不一致

select * from a,b where a.id2=b.id2;

重分布: m+ n

某個廣播 min(m,n)*z

同樣比較兩者的大小

左連線

1、分布鍵與關聯鍵一致,單庫連線

2、一張表的分布鍵與關聯鍵不一致

select * from a left join b on a.id1=b.id2;

左邊不能廣播,而且左表關聯鍵為分布鍵,那麼對於這個連線,只能是b表操作,b表重分布為n,b表廣播為n*z

資料量為n

select * from a left join b on a.id2=b.id;

左連線,左表不能被廣播,那麼

1、a表重分布  m

2、將b表廣播,n*z

3、兩張表的分布鍵與關聯鍵不一致

select * from a left join b on a.id2=b.id2;

還有兩種方式

將表a與表b都按照id2欄位將資料重分布一遍,資料量m+n

表a不能廣播,只能將b,代價為n*z

全連線

1、關聯鍵為分布鍵,單庫連線

select * from a full outer join b where a.id=b.id;

2、一張表的分布鍵與關聯鍵不一致

select *  from a full outer join b where a.id=b.id2;

兩者都不能被廣播,那麼只能為重分布

只能為 n

3、select * from a full outer join b where a.id2=b.id2;

將兩張表重分布 m+n   

兩表關聯計數統計

一 背景 最近看到很多這樣的sql考察,如 a user 表有id,name欄位等,b log 表有id,a.id等,統計每個人日誌記錄數,沒有日誌記錄的為0,最後輸出id,name,log count欄位 二 sql解析 1.先放sql看看 表資料user表 log表 結果 2.解析 看內層有個聚...

oracle insert兩個關聯表

現有一張老師學生表 tb tea cou 由於業務需要,需把老師學生表tb tea stu拆分成兩張表 tb tea tb cou 並把記錄insert到這兩張子表中 tb tea tb cou為關聯的兩張表 表結構如下 tb tea cou id,pk name,任課老師 zc,職稱 course...

oracle 兩表關聯查詢

情景描述 查詢學生表student,sname,age資訊及所在班級clazz表 select sname,age,cname from student t1 left join clazz t2 on t1.cid t2.cid select sname,age,cname from studen...