達夢分布式集群DPC_分布式執行計劃執行拆分流程
- 1 DPC任務拆分原理
-
- 1.1 分布式架構思想
- 1.2 DPC如何實現任務拆分?
- 2 DPC任務拆分完整示例
-
- 2.1 單表查詢
-
- 2.1.1 創建分區表,存儲在不同BP上
- 2.1.2 生成sql的最佳執行計劃
- 2.1.3 代碼生成并執行、拆分
-
- 2.1.3.1 任務拆分步驟
- 2.1.3.2 任務拆分圖示
- 2.1.3.3 子任務執行詳情查看
- 2.2 表連接任務拆分
-
- 2.2.1 前期準備
- 2.2.2 任務拆分
- 2.2.3 任務拆分圖解
- 2.2.4 子任務執行詳情
1 DPC任務拆分原理
1.1 分布式架構思想
從單機-分布式,最大的變化是表數據從存儲到一個節點(一臺服務器),變化成分散到多個節點(多臺服務器存儲);
例如 當客戶端產生一個任務時,如執行"select *from表"
1.單機的任務執行方式為單線程調度,例如一個人承包一個任務
2.當表數據存儲在多臺服務器,就出現了任務拆分的解決方案,任務拆分為多個部分,每個人負責一部分,最后對結果匯總
通過將大任務分為多個小任務,每個小任務存儲在不同服務器,讓多臺服務器并行執行任務來提升性能
1.2 DPC如何實現任務拆分?
達夢dpc的架構為SP+MP+BP,計算節點+元數據節點+數據存儲節點
1. SP為計算節點:
作用為進行分布式執行計劃的生成,分發子任務到BP,結果集匯總等
例如
SP類似于總控節點,對任務進行拆解,并分發任務給BP
2. MP為元數據節點:
提供數據字典信息,包含數據分布等信息
例如
MP存儲了哪個分區存儲在哪個BP上
可以給SP提供元數據信息,方便SP的任務分發和計劃生成等
3. BP是數據存儲節點:
BP是數據存儲節點,一般每臺服務器至少配置1個BP,方便數據拆分,并執行SP分發的任務
例如
建表時通過創建分區表,指定不同的分區存儲在不同BP上,實現數據拆分;
達夢DPC通過這三層架構協同,來解決分布式任務的拆分執行問題
2 DPC任務拆分完整示例
2.1 單表查詢
2.1.1 創建分區表,存儲在不同BP上
create table Y1(A int, B int) partition by hash(A) partitions 3 ;
--默認會存儲在3個BP上
2.1.2 生成sql的最佳執行計劃
1.sql請求:客戶端連接SP發送sql語句 select *from Y1;2.解析:SP收到請求后,向MP申請Y1表的元數據信息,然后進行語法檢查、語義檢查、共享池檢查3.優化器階段:默認沒有緩存,會進行到優化器階段,生成最佳執行計劃①.優化器會首先生成單機版本的最佳執行計劃(CBO)project[0x1215e4170] n_exp(3) (cost: 0.04461, rows: 1)base table[0x1215e4cc8] (Y1, INDEX47617565, FULL SEARCH) (cost: 0.04461, rows: 1)②生成單機最佳執行計劃后,插入分發操作符(send、recv為分布式操作符)recv[0x1215e6f20] (cost: 0.04461, rows: 1)send[0x1215e68d8] send_type(DIRECT) sites(5:1,12:1,10:1) gi_polic(UNIT) (cost: 0.04461, rows: 1)project[0x1215e4170] n_exp(3) (cost: 0.04461, rows: 1)base table[0x1215e4cc8] (Y1, INDEX47617565, FULL SEARCH) (cost: 0.04461, rows: 1)最佳執行計劃
1 #NSET2: [1, 1, 20]
2 #ERECV: [1, 1, 20]; stask_no(-1), l_stask_no(0), n_key(0), in_turn(0), trig(0)
3 #ESEND: [1, 1, 20]; stask_no(0), type(DIRECT), sites(5:1,12:1,10:1), sql_invoke(0), pwj_opt(0), table(-); INFO_BITS(0xc)
4 #GI: [1, 1, 20]; policy(PART_UNIT), gi_unit[0..0], scan_type[0](FULL)
5 #PRJT2: [1, 1, 20]; exp_num(3), is_atom(FALSE)
6 #CSCN2: [1, 1, 20]; INDEX47617565(Y1); btr_scan(1)
2.1.3 代碼生成并執行、拆分
當拿到最佳執行計劃后,進行可執行代碼生成后執行
2.1.3.1 任務拆分步驟
①任務分發
NSET2執行根計劃,任務號為stask_no(-1)=-1,往下走遇到了ERECV,這個是分布式的操作符,開始進行任務分割和數據分發,QC(查詢調度總單元)調度發送所有子計劃到BP上;
2 #ERECV: [1, 1, 20]; stask_no(-1), l_stask_no(0), n_key(0), in_turn(0), trig(0)
3 #ESEND: [1, 1, 20]; stask_no(0), type(DIRECT), sites(5:1,12:1,10:1), sql_invoke(0), pwj_opt(0), table(-); INFO_BITS(0xc)--分析
主任務號為stask_no(-1),子任務號為