關聯查詢使用分布鍵關聯
更新時間 2025-02-05 09:36:57
最近更新時間: 2025-02-05 09:36:57
分享文章
本頁介紹天翼云TeleDB數據庫關聯查詢使用分布鍵關聯的最佳實踐。
多表關聯時,通過explain查看執行計劃,查看SQL語句是否使用到分布鍵(前面已介紹),查看SQL關聯是否使用到了分布鍵。
如果兩表關聯都使用到了分布鍵,那么兩表關聯可以在dn節點內完成,不需要在dn節點之間交互數據;如果其中一張表沒有用分布鍵,那么兩表關聯不能在dn節點內完成,該表需要在dn節點之間交互數據;如果兩張表都沒有使用分布鍵,那么兩張表都需要在dn節點之間交互數據。
兩表關聯時,應優先使用兩表的分布鍵關聯,盡量保證高頻并發的SQL都用到了分布鍵關聯;其次至少有一張表用到了分布鍵,也可以減少一次數據重分布;兩張表都沒有用到分布鍵的場景應盡量避免。同時,兩表關聯時如果只能有一個表帶分布鍵,那么更大的表、或查詢結果集更大的表優先使用到分布鍵,讓小一點的表去重分布數據。
在執行計劃中,如果DN之間有數據重分布,那么執行計劃中會有這樣的關鍵字Distribute results by S: f1,這里表示按f1進行數據重分布。
例如,teledb_1的分布鍵為f2,teledb_2的分布鍵為f1,下面的SQL,兩表關聯時teledb_1沒有用到分布鍵,兩表關聯不能在dn節點內完成,需要dn節點之間發起數據交互(重分布),teledb_1在完成表掃描后發起了按f1字段重分布的動作,對應執行計劃中的Distribute results by S: f1。
teledb=# explain select teledb_1.* from teledb_1,teledb_2 where teledb_1.f1=teledb_2.f1 ;
QUERY PLAN
------------------------------------------------------------------------------------------------
Remote Subquery Scan on all (dn001,dn002) (cost=29.80..186.32 rows=3872 width=40)
-> Hash Join (cost=29.80..186.32 rows=3872 width=40)
Hash Cond: (teledb_1.f1 = teledb_2.f1)
-> Remote Subquery Scan on all (dn001,dn002) (cost=100.00..158.40 rows=880 width=40)
Distribute results by S: f1
-> Seq Scan on teledb_1 (cost=0.00..18.80 rows=880 width=40)
-> Hash (cost=18.80..18.80 rows=880 width=4)
-> Seq Scan on teledb_2 (cost=0.00..18.80 rows=880 width=4)
(8 rows)
例如下面的SQL,teledb_1和teledb_2關聯時都用到了分布鍵,那么兩表關聯可以在dn節點內完成,不需要在dn節點之間交互數據。
teledb=# explain select teledb_1.* from teledb_1,teledb_2 where teledb_1.f2=teledb_2.f1 ;
QUERY PLAN
---------------------------------------------------------------------------------
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001, dn002
-> Hash Join (cost=18904.69..46257.08 rows=500564 width=14)
Hash Cond: (teledb_1.f2 = teledb_2.f1)
-> Seq Scan on teledb_1 (cost=0.00..9225.64 rows=500564 width=14)
-> Hash (cost=9225.64..9225.64 rows=500564 width=4)
-> Seq Scan on teledb_2 (cost=0.00..9225.64 rows=500564 width=4)
(7 rows)