倘若沒有并行查詢技術(shù),一個串行執(zhí)行的查詢語句只能利用CPU或者磁盤設備中的一個,而不能利用整個計算機的處理能力。并行查詢技術(shù)的出現(xiàn),使得單個SQL語句能利用多個CPU和磁盤設備的處理能力。其優(yōu)勢在于可以通過多個線程來處理查詢?nèi)蝿?,從而提高查詢的效率?br>

          達夢數(shù)據(jù)庫為具有多個CPU的數(shù)據(jù)庫服務器提供并行查詢的功能,以優(yōu)化查詢?nèi)蝿盏男阅?。?shù)據(jù)庫服務器只有具有多個CPU,才能使用并行執(zhí)行查詢操作,來提高查詢?nèi)蝿盏乃俣取?br>
          達夢數(shù)據(jù)庫通過三個步驟來完成并行查詢:首先,確定并行任務數(shù);其次,確定并行工作線程數(shù);最后,執(zhí)行查詢。并行查詢相關(guān)參數(shù)見下表:
          參數(shù)名 缺省值 屬性 說明
          MAX_PARALLEL_DEGREE 1 動態(tài),會話級
          用來設置默認并行任務個數(shù)。取值范圍:1~128。缺省值1,表示無并行任務。當PARALLEL_POLICY值為1時該參數(shù)值才有效。

          parallel_policy 0 靜態(tài) 用來設置并行策略。取值范圍:0、1和2,缺省為0。其中,0表示不支持并行;1表示自動并行模式;2表示手動并行模式。

          PARALLEL_THRD_NUM 10 靜態(tài) 用來設置并行工作線程個數(shù)。取值范圍:1~1024。


          當開啟自動并行(PARALLEL_POLICY=1)時,參數(shù)MAX_PARALLEL_DEGREE生效,控制并行查詢最多使用的線程數(shù)。MAX_PARALLEL_DEGREE缺省值為1,表示不并行。此時若指定參數(shù)對應的HINT
          “PARALLEL”,則使用HINT值;

          當開啟手動并行(PARALLEL_POLICY=2)時,參數(shù)MAX_PARALLEL_DEGREE失效,用戶需要在語句中使用此參數(shù)對應的HINT
          “PARALLEL”指定語句的并行度,否則不并行。

          1.在INI參數(shù)中設置默認值

          INI參數(shù)MAX_PARALLEL_DEGREE設置最大并行任務個數(shù)。取值范圍:1~128。缺省值1,表示無并行任務,此參數(shù)僅在PARALLEL_POLICY值為1時才有效。
          例如,在INI參數(shù)中將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參數(shù)值

          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.
          下面的查詢將查看內(nèi)存中的max_parallel_degree參數(shù)值

          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.
          現(xiàn)在執(zhí)行下面的命令來同時修改內(nèi)存與dm.ini文件中的max_parallel_degree參數(shù)為3

          SQL> call sp_set_para_value(1,'MAX_PARALLEL_DEGREE',3);
          DMSQL executed successfully
          used time: 7.183(ms). Execute id is 200.
          執(zhí)行下面的查詢可以看到max_parallel_degree參數(shù)修改為3了

          SQL> select sf_get_para_value(1,'MAX_PARALLEL_DEGREE');

          LINEID SF_GET_PARA_VALUE(1,'MAX_PARALLEL_DEGREE')
          ---------- ------------------------------------------
          1 3

          used time: 5.544(ms). Execute id is 201.
          從查詢返回的sess_value與file_value都為3可以確定max_parallel_degree在dm.ini文件中已經(jīng)被修改了

          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 3 1 128 N 3 3 Maximum degree of parallel query SESSION

          used time: 6.910(ms). Execute id is 202.
          從查詢返回的sys_value為3可以在內(nèi)存中max_parallel_degree也已經(jīng)被修改了。

          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 3 3 3 Maximum degree of parallel query

          used time: 6.335(ms). Execute id is 203.
          然后,使用一般的SQL語句查詢即可執(zhí)行并行查詢,不需要使用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.
          執(zhí)行計劃中的LOCAL COLLECT 代表:本地并行下數(shù)據(jù)收集處理,代替LOCAL GATHER。

          2.在SQL語句中使用“PARALLEL”關(guān)鍵字特別指定

          當PARALLEL_POLICY=2時,需要在SQL語句中通過“PARALLEL”HINT指定并行度,否則不并行。若PARALLEL_POLICY=1,則SQL語句中使用的“PARALLEL”HINT總是優(yōu)先于MAX_PARALLEL_DEGREE參數(shù)設置?!癙ARALLEL”關(guān)鍵字的用法是在數(shù)據(jù)查詢語句的SELECT關(guān)鍵字后,增加HINT子句來實現(xiàn)。

          HINT語法格式如下:
          /+ PARALLEL([< 表名>] < 并行任務個數(shù)>) /

          例如,下面的例子中,即使已經(jīng)設置了MAX_PARALLEL_DEGREE默認值3,但實際使用的為PARALLEL指定的任務個數(shù)4:

          SQL> explain SELECT /+ PARALLEL(4) / * 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.967(ms). Execute id is 0.
          另外,每個語句中僅能設置一次并行任務個數(shù),如果設置了多次,則以最后一次設置為準,而且任務個數(shù)在全語句中生效。

          例如,下面的例子中,使用的并行任務個數(shù)為2。

          SQL> call sp_set_para_value(1,'MAX_PARALLEL_DEGREE',1);
          DMSQL executed successfully
          used time: 6.554(ms). Execute id is 211.
          SQL> select sf_get_para_value(1,'MAX_PARALLEL_DEGREE');

          LINEID SF_GET_PARA_VALUE(1,'MAX_PARALLEL_DEGREE')
          ---------- ------------------------------------------
          1 1

          used time: 5.569(ms). Execute id is 212.

          SQL> explain SELECT /+ PARALLEL(1) //+ PARALLEL(2) / * 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: 1.067(ms). Execute id is 0.
          這種方式能夠為單條查詢語句設置額外的并行任務個數(shù),以此來提高某些特殊查詢?nèi)蝿盏男阅堋?br>

          在執(zhí)行并行查詢?nèi)蝿罩埃枰付ㄍ瓿稍撊蝿盏牟⑿泄ぷ骶€程數(shù)。值得注意的是,實際使用的線程數(shù)并非總是等于并行工作線程數(shù)。并行工作線程數(shù)是在INI參數(shù)中設定的,實際使用并行工作線程數(shù)是根據(jù)系統(tǒng)的實際狀況確定的。
          1. 并行工作線程數(shù),在INI參數(shù)中設定
          首先,使用PARALLEL_POLICY參數(shù)來設置并行策略。取值范圍:0、1和2,默認值0。其中,0表示不支持并行;1表示自動并行模式;2表示手動并行模式。


          當開啟本地并行(PARALLEL_POLICY>0)時,使用PARALLEL_THRD_NUM指定本地并行查詢使用的線程數(shù),取值范圍為1~1024,缺省值為10。需要注意的是,若PARALLEL_POLICY=1,如果PARALLEL_THRD_NUM=1,
          則按照CPU個數(shù)創(chuàng)建并行線程。

          例如,設置并行策略PARALLEL_POLICY為2,即手動設置并行工作線程數(shù);同時,設置并行工作線程數(shù)PARALLEL_THRD_NUM為4個。

          SQL> call sp_set_para_value(2,'PARALLEL_POLICY',2);
          DMSQL executed successfully
          used time: 6.942(ms). Execute id is 223.
          SQL> call sp_set_para_value(2,'PARALLEL_THRD_NUM',4);
          DMSQL executed successfully
          used time: 6.871(ms). Execute id is 224.
          當然,并非所有的查詢都適合使用并行查詢。大量占用CPU
          周期的查詢最適合采用并行查詢的功能。例如,大型表的連接查詢、大量數(shù)據(jù)的聚合和大型結(jié)果集的排序等都很適合采用并行查詢。對于簡單查詢(常用于事務處理應用程序)而言,執(zhí)行并行查詢所需的額外協(xié)調(diào)工作會大于潛在的性能提升。所以,數(shù)據(jù)庫管理員在確定是否需要使用并行策略的時候,需要慎重。

          2. 實際使用的線程數(shù),達夢數(shù)據(jù)庫會根據(jù)每個并行查詢操作自動檢測

          實際使用線程數(shù)是數(shù)據(jù)庫在查詢計劃執(zhí)行時初始化的時候確定的。也就是說,這不需要用戶去干預,而是系統(tǒng)根據(jù)并行任務數(shù)和實際空閑的并行工作線程數(shù)來確定的。此操作所依據(jù)的條件如下:首先,檢測達夢數(shù)據(jù)庫是否運行在具有多個CPU的計算機上。只有具有多個CPU
          的計算機才能使用并行查詢。這是一個硬性的限制條件。其次,檢測可用的空閑工作線程是否足夠。并行查詢到底采用多少線程數(shù),除了跟操作的復雜程度相關(guān)外,還跟當時的服務器狀態(tài)相關(guān),如是否有足夠的可用的空閑工作線程數(shù)量等。每個并行查詢操作都要求一定的工作線程數(shù)量才能夠執(zhí)行;而且執(zhí)行并行計劃比執(zhí)行串行計劃需要更多的線程,所需要的線程數(shù)量也會隨著任務個數(shù)的提高而增加。當無法滿足特定并行查詢執(zhí)行的線程要求時,數(shù)據(jù)庫引擎就會自動減少任務個數(shù),甚至會放棄并行查詢而改為串行計劃。所以,即使同一個操作在不同時候可能會采用不同的線程數(shù)。

          例如,即使設置并行工作線程數(shù)為4。而實際使用的線程數(shù)可能只有3個,或者更少。


          使用手動并行模式時,只需要在INI參數(shù)中設置好如下2個參數(shù),然后執(zhí)行并行SQL查詢語句時,需手動指定當前并行任務個數(shù)。若不指定,將不使用并行。設置的2個參數(shù)如下:
          PARALLEL_POLICY 2
          PARALLEL_THRD_NUM 4

          使用自動并行模式時,一般指定如下三個參數(shù):
          MAX_PARALLEL_DEGREE 3
          PARALLEL_POLICY 1
          PARALLEL_THRD_NUM 10
          另外,當PARALLEL_POLICY為0時,即使有并行任務,也不支持并行。

          然后,執(zhí)行語法格式類似“SELECT * FROM SYSOBJECTS;”的并行SQL語句即可,本條語句使用默認并行任務數(shù)3。


          當然,如果單條查詢語句不想使用默認并行任務數(shù),可以通過在SQL語句中增加HINT,通過“PARALLEL”關(guān)鍵字來特別指定。此時,執(zhí)行的并行SQL語句格式為“SELECT
          /+ PARALLEL(SYSOBJECTS 4) / * FROM SYSOBJECTS;”,本條語句使用的并行任務數(shù)為4。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                豆花视频成人版网站入口 | 77777免费观看电视剧推荐爱的教育 | 国产一区二区三区四区视频 | 操操插插 | 日韩欧美一区二区三区在线观看 |