久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

DM怎樣進行并行查詢

210次閱讀
沒有評論

共計 6852 個字符,預計需要花費 18 分鐘才能閱讀完成。

DM 怎樣進行并行查詢,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

倘若沒有并行查詢技術,一個串行執行的查詢語句只能利用 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 了

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 文件中已經被修改了

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 可以在內存中 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 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 參數設置?!癙ARALLEL”關鍵字的用法是在數據查詢語句的 SELECT 關鍵字后,增加 HINT 子句來實現。

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

例如,下面的例子中,即使已經設置了 MAX_PARALLEL_DEGREE 默認值 3,但實際使用的為 PARALLEL 指定的任務個數 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.

另外,每個語句中僅能設置一次并行任務個數,如果設置了多次,則以最后一次設置為準,而且任務個數在全語句中生效。

例如,下面的例子中,使用的并行任務個數為 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.

這種方式能夠為單條查詢語句設置額外的并行任務個數,以此來提高某些特殊查詢任務的性能。

在執行并行查詢任務之前,您需要指定完成該任務的并行工作線程數。值得注意的是,實際使用的線程數并非總是等于并行工作線程數。并行工作線程數是在 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);
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 周期的查詢最適合采用并行查詢的功能。例如,大型表的連接查詢、大量數據的聚合和大型結果集的排序等都很適合采用并行查詢。對于簡單查詢(常用于事務處理應用程序)而言,執行并行查詢所需的額外協調工作會大于潛在的性能提升。所以,數據庫管理員在確定是否需要使用并行策略的時候,需要慎重。

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

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

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

使用自動并行模式時,一般指定如下三個參數:
MAX_PARALLEL_DEGREE 3
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。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-18發表,共計6852字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 正定县| 绵阳市| 夹江县| 奉贤区| 越西县| 汝州市| 长兴县| 于都县| 鸡泽县| 大冶市| 通海县| 万盛区| 宝山区| 金沙县| 营口市| 柘城县| 青海省| 苏尼特右旗| 洞头县| 济阳县| 保康县| 汉寿县| 衡阳县| 塔河县| 沭阳县| 乐清市| 岳普湖县| 扎兰屯市| 汽车| 田东县| 深圳市| 太仆寺旗| 扎囊县| 蒙阴县| 九台市| 常宁市| 家居| 濉溪县| 鄄城县| 泾阳县| 安徽省|