DM並行查詢
倘若沒有並行查詢技術,一個序列執行的查詢語句只能利用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引數設定。“PARALLEL”關鍵字的用法是在資料查詢語句的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。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2667246/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL並行查詢概述SQL並行
- Oracle並行操作——並行查詢(Parallel Query)Oracle並行Parallel
- 表和索引並行查詢索引並行
- DM8 閃回查詢
- oracle表查詢的並行度Oracle並行
- 並行查詢並行度Degree與instances 設定並行
- oracle並行查詢一例薦Oracle並行
- 什麼是並行查詢及其原理並行
- 【Oracle】如何查詢並行是否起作用?Oracle並行
- 用並行查詢讓SQL Server加速執行並行SQLServer
- oracle 並行查詢時並行資源分配追蹤測試Oracle並行
- PostgreSQL並行查詢相關配置引數SQL並行
- union的兩個子查詢是否並行並行
- RAC中的並行查詢 DOP(Degree of Parallelism)並行Parallel
- TDSQL-C 並行查詢技術探索SQL並行
- 並行查詢緩慢的問題分析並行
- RAC環境對並行查詢的支援並行
- DM7閃回與閃回查詢
- Elasticsearch 或並查詢Elasticsearch
- Parallel Query Tuning(並行化查詢優化)Parallel並行優化
- oracle 並行cpu查詢分割槽表測試Oracle並行
- 【記錄】sqlserver列轉行查詢 並將查詢結果用逗號分隔開SQLServer
- PostgreSQL-並行雜湊JOIN分析查詢效能爆炸SQL並行
- C#中的並行處理、並行查詢的方法你用對了嗎?C#並行
- GAIA-IR: GraphScope 上的並行化圖查詢引擎AI並行
- 查詢當前正在執行的SQL語句並KILLSQL
- [ORACLE BUG]查詢結果錯誤--臨時表並行Oracle並行
- Oracle11gRAC跨節點 並行查詢的控制Oracle並行
- 建立支援類別下拉選單的Oracle查詢表DMOracle
- Elasticsearch 並或查詢 JSONElasticsearchJSON
- DM7使用dmrestore執行並行對映檔案還原REST並行
- 8.0新特性-並行查詢innodb_parallel_read_threads並行Parallelthread
- PostgreSQL技術大講堂 - 第33講:並行查詢管理SQL並行
- 查詢並解除oracle的死鎖Oracle
- MySQL 8.0新特性-並行查詢innodb_parallel_read_threadsMySql並行Parallelthread
- 並行查詢對於響應時間的影響實驗並行
- 效能查詢並殺CPU高耗程式
- find和ls並用,查詢檔案並顯示大小 .