倘若沒有并行查詢技術,一個串行執行的查詢語句隻能利用CPU或者磁盤裝置中的一個,而不能利用整個計算機的處理能力。并行查詢技術的出現,使得單個SQL語句能利用多個CPU和磁盤裝置的處理能力。其優勢在于可以通過多個線程來處理查詢任務,進而提高查詢的效率。
達夢資料庫為具有多個CPU的資料庫伺服器提供并行查詢的功能,以優化查詢任務的性能。資料庫伺服器隻有具有多個CPU,才能使用并行執行查詢操作,來提高查詢任務的速度。
達夢資料庫通過三個步驟來完成并行查詢:首先,确定并行任務數;其次,确定并行工作線程數;最後,執行查詢。并行查詢相關參數見下表:
參數名 預設值 屬性 說明
MAX_PARALLEL_DEGREE 1 動态,會話級 用來設定預設并行任務個數。取值範圍:1~128。預設值1,表示無并行任務。當PARALLEL_POLICY值為1時該參數值才有效。
parallel_policy 0 靜态 用來設定并行政策。取值範圍:0、1和2,預設為0。其中,0表示不支援并行;1表示自動并行模式;2表示手動并行模式。
PARALLEL_THRD_NUM 10 靜态 用來設定并行工作線程個數。取值範圍:1~1024。
當開啟自動并行(PARALLEL_POLICY=1)時,參數MAX_PARALLEL_DEGREE生效,控制并行查詢最多使用的線程數。MAX_PARALLEL_DEGREE預設值為1,表示不并行。此時若指定參數對應的HINT “PARALLEL”,則使用HINT值;
當開啟手動并行(PARALLEL_POLICY=2)時,參數MAX_PARALLEL_DEGREE失效,使用者需要在語句中使用此參數對應的HINT “PARALLEL”指定語句的并行度,否則不并行。
1.在INI參數中設定預設值
INI參數MAX_PARALLEL_DEGREE設定最大并行任務個數。取值範圍:1~128。預設值1,表示無并行任務,此參數僅在PARALLEL_POLICY值為1時才有效。
例如,在INI參數中将MAX_PARALLEL_DEGREE設定為3的格式如下:
MAX_PARALLEL_DEGREE 3
先檢視max_parallel_degree的預設值
SQL> select sf_get_para_value(1,'MAX_PARALLEL_DEGREE');
LINEID SF_GET_PARA_VALUE(1,'MAX_PARALLEL_DEGREE')
---------- ------------------------------------------
1 1
used time: 150.207(ms). Execute id is 197.
下面的查詢将檢視dm.ini檔案中設定的max_parallel_degree參數值
SQL> select * from v$dm_ini where para_name='MAX_PARALLEL_DEGREE';
LINEID PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE
---------- ------------------- ---------- --------- --------- ------- ---------- ---------- -------------------------------- ---------
1 MAX_PARALLEL_DEGREE 1 1 128 N 1 1 Maximum degree of parallel query SESSION
used time: 50.228(ms). Execute id is 198.
下面的查詢将檢視記憶體中的max_parallel_degree參數值
SQL> select * from v$parameter where name='MAX_PARALLEL_DEGREE';
LINEID ID NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- ----------- ------------------- ------- ----- --------- ---------- --------------------------------
1 274 MAX_PARALLEL_DEGREE SESSION 1 1 1 Maximum degree of parallel query
used time: 7.440(ms). Execute id is 199.
現在執行下面的指令來同時修改記憶體與dm.ini檔案中的max_parallel_degree參數為3
SQL> call sp_set_para_value(1,'MAX_PARALLEL_DEGREE',3);
DMSQL executed successfully
used time: 7.183(ms). Execute id is 200.
執行下面的查詢可以看到max_parallel_degree參數修改為3了
1 3
used time: 5.544(ms). Execute id is 201.
從查詢傳回的sess_value與file_value都為3可以确定max_parallel_degree在dm.ini檔案中已經被修改了
1 MAX_PARALLEL_DEGREE 3 1 128 N 3 3 Maximum degree of parallel query SESSION
used time: 6.910(ms). Execute id is 202.
從查詢傳回的sys_value為3可以在記憶體中max_parallel_degree也已經被修改了。
1 274 MAX_PARALLEL_DEGREE SESSION 3 3 3 Maximum degree of parallel query
used time: 6.335(ms). Execute id is 203.
然後,使用一般的SQL語句查詢即可執行并行查詢,不需要使用HINT。如:
SQL> explain SELECT * FROM SYSOBJECTS;
1 #NSET2: [0, 1694, 396]
2 #LOCAL COLLECT: [0, 1694, 396]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0) for_sync(FALSE)
3 #PRJT2: [0, 1694, 396]; exp_num(17), is_atom(FALSE)
4 #CSCN2: [0, 1694, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
used time: 0.951(ms). Execute id is 0.
執行計劃中的LOCAL COLLECT 代表:本地并行下資料收集處理,代替LOCAL GATHER。
2.在SQL語句中使用“PARALLEL”關鍵字特别指定
當PARALLEL_POLICY=2時,需要在SQL語句中通過“PARALLEL”HINT指定并行度,否則不并行。若PARALLEL_POLICY=1,則SQL語句中使用的“PARALLEL”HINT總是優先于MAX_PARALLEL_DEGREE參數設定。“PARALLEL”關鍵字的用法是在資料查詢語句的SELECT關鍵字後,增加HINT子句來實作。
HINT文法格式如下:
/+ PARALLEL([< 表名>] < 并行任務個數>) /
例如,下面的例子中,即使已經設定了MAX_PARALLEL_DEGREE預設值3,但實際使用的為PARALLEL指定的任務個數4:
SQL> explain SELECT /+ PARALLEL(4) / * FROM SYSOBJECTS;
used time: 0.967(ms). Execute id is 0.
另外,每個語句中僅能設定一次并行任務個數,如果設定了多次,則以最後一次設定為準,而且任務個數在全語句中生效。
例如,下面的例子中,使用的并行任務個數為2。
SQL> call sp_set_para_value(1,'MAX_PARALLEL_DEGREE',1);
used time: 6.554(ms). Execute id is 211.
used time: 5.569(ms). Execute id is 212.
SQL> explain SELECT /+ PARALLEL(1) //+ PARALLEL(2) / * FROM SYSOBJECTS;
used time: 1.067(ms). Execute id is 0.
這種方式能夠為單條查詢語句設定額外的并行任務個數,以此來提高某些特殊查詢任務的性能。
在執行并行查詢任務之前,您需要指定完成該任務的并行工作線程數。值得注意的是,實際使用的線程數并非總是等于并行工作線程數。并行工作線程數是在INI參數中設定的,實際使用并行工作線程數是根據系統的實際狀況确定的。
1. 并行工作線程數,在INI參數中設定
首先,使用PARALLEL_POLICY參數來設定并行政策。取值範圍:0、1和2,預設值0。其中,0表示不支援并行;1表示自動并行模式;2表示手動并行模式。
當開啟本地并行(PARALLEL_POLICY>0)時,使用PARALLEL_THRD_NUM指定本地并行查詢使用的線程數,取值範圍為1~1024,預設值為10。需要注意的是,若PARALLEL_POLICY=1,如果PARALLEL_THRD_NUM=1, 則按照CPU個數建立并行線程。
例如,設定并行政策PARALLEL_POLICY為2,即手動設定并行工作線程數;同時,設定并行工作線程數PARALLEL_THRD_NUM為4個。
SQL> call sp_set_para_value(2,'PARALLEL_POLICY',2);
used time: 6.942(ms). Execute id is 223.
SQL> call sp_set_para_value(2,'PARALLEL_THRD_NUM',4);
used time: 6.871(ms). Execute id is 224.
當然,并非所有的查詢都适合使用并行查詢。大量占用CPU 周期的查詢最适合采用并行查詢的功能。例如,大型表的連接配接查詢、大量資料的聚合和大型結果集的排序等都很适合采用并行查詢。對于簡單查詢(常用于事務處理應用程式)而言,執行并行查詢所需的額外協調工作會大于潛在的性能提升。是以,資料庫管理者在确定是否需要使用并行政策的時候,需要慎重。
2. 實際使用的線程數,達夢資料庫會根據每個并行查詢操作自動檢測
實際使用線程數是資料庫在查詢計劃執行時初始化的時候确定的。也就是說,這不需要使用者去幹預,而是系統根據并行任務數和實際空閑的并行工作線程數來确定的。此操作所依據的條件如下:首先,檢測達夢資料庫是否運作在具有多個CPU的計算機上。隻有具有多個CPU 的計算機才能使用并行查詢。這是一個硬性的限制條件。其次,檢測可用的空閑工作線程是否足夠。并行查詢到底采用多少線程數,除了跟操作的複雜程度相關外,還跟當時的伺服器狀态相關,如是否有足夠的可用的空閑工作線程數量等。每個并行查詢操作都要求一定的工作線程數量才能夠執行;而且執行并行計劃比執行串行計劃需要更多的線程,所需要的線程數量也會随着任務個數的提高而增加。當無法滿足特定并行查詢執行的線程要求時,資料庫引擎就會自動減少任務個數,甚至會放棄并行查詢而改為串行計劃。是以,即使同一個操作在不同時候可能會采用不同的線程數。
例如,即使設定并行工作線程數為4。而實際使用的線程數可能隻有3個,或者更少。
使用手動并行模式時,隻需要在INI參數中設定好如下2個參數,然後執行并行SQL查詢語句時,需手動指定目前并行任務個數。若不指定,将不使用并行。設定的2個參數如下:
PARALLEL_POLICY 2
PARALLEL_THRD_NUM 4
使用自動并行模式時,一般指定如下三個參數:
PARALLEL_POLICY 1
PARALLEL_THRD_NUM 10
另外,當PARALLEL_POLICY為0時,即使有并行任務,也不支援并行。
然後,執行文法格式類似“SELECT * FROM SYSOBJECTS;”的并行SQL語句即可,本條語句使用預設并行任務數3。
當然,如果單條查詢語句不想使用預設并行任務數,可以通過在SQL語句中增加HINT,通過“PARALLEL”關鍵字來特别指定。此時,執行的并行SQL語句格式為“SELECT /+ PARALLEL(SYSOBJECTS 4) / * FROM SYSOBJECTS;”,本條語句使用的并行任務數為4。