您好,登錄后才能下訂單哦!
并行執行是同時開啟多個進程/線程來完成同一個任務,并行執行的每一個進程/線程都會消耗額外的硬件資源,所以并行執行的本質就是以額外的硬件資源消耗來換取執行時間的縮短。這里的額外硬件資源消耗是指對數據庫服務器上多個CPU、內存、從個I/O通道,甚至是RAC環境下多個數據庫節點的額外利用。
下面總結一下Oracle里開啟并行的幾種方法
1、更改目標表的并行度
有兩種方法修改目標表的并行度
alter table table_name parallel;
alter table table_name parallel n;
其中方法1 是把指定表的并行度修改為默認值,方法2是把指定表的并行度修改為n;
查看表EMP當前的并行度為1
scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP 1
想用默認的并行度去訪問表EMP
scott@TEST>alter table emp parallel; Table altered. scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP DEFAULT scott@TEST>set autotrace traceonly scott@TEST>select * from emp; 14 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- .....
從上面的執行計劃中可以看出,走的是對表EMP的全表掃描,PX...表示的就是走的并行
默認并行度的算法如下:
默認并行度=parallel_threads_per_cpu*cpu_count
如果想對表開啟8個并行度則執行:alter table emp parallel 8;
scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP DEFAULT scott@TEST>alter table emp parallel 8; Table altered. scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP 8
2、使用并行Hint
有如下一些并行Hint可以用來控制是否啟用并行及指定并行度
1) /*+ parallel(table[,degree]) */ #用于指定并行度去訪問指定表,如果沒有指定并行度degree,則使用Oracle默認并行度
2) /*+ noparallel(table) */ #對指定表不使用并行訪問
3) /*+ parallel_index(table[,index[,degree]]) */ #對指定的分區索引以指定的并行度去做并行范圍掃描
4) /*+ no_parallel_index(table[,index]) */ #對指定的分區索不使用并行訪問
5) /*+ pq_distribute(table,out,in) */ #對指定表以out/in所指定的方式來傳遞數據,這里out/in的值可以是HASH/NONE/BROADCAST/PARTITION中的任意一種如/*+ pq_distribute(table,none,partition) */
把表EMP修改回并行度為1
scott@TEST>alter table emp noparallel; Table altered. scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP 1
使用并行Hint執行上之前的SQL
scott@TEST>select /*+ parallel(emp) */* from emp; 14 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | --------------------------------------------------------------------------------------------------------------
從上面的執行計劃中可以看出,走的是并行
3、使用alter session命令
使用alter session命令,可以在當前session中強制啟用并行查詢或并行DML。如果強制啟用了并行查詢或者并行DML,那就意味著從執行alter session命令強制開啟并行的那個時間點開始,在這個session中隨后執行的所有SQL都將以并行的方式執行,有如下四種方法在當前session中強制開啟并行
1) alter session parallel query
在當前session中強制開啟并行查詢,沒有指定并行度,Oracle使用默認并行度
2) alter session parallel query parallel n
在當前session中強制開啟并行查詢,并且指定并行度為n
3) alter session parallel dml
在當前session中強制開啟并行DML,沒有指定并行度,Oracle使用默認并行度
4) alter session parallel dml parallel n
在當前session中強制開啟并行DML,并且指定并行度為n
表EMP并行度仍為1,在session中強制開啟并行:
scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP 1 scott@TEST>set autotrace traceonly scott@TEST>alter session force parallel query; Session altered. scott@TEST>select * from emp; 14 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 2873591275 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 2 (0)| 00:00:01 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP | 14 | 1218 | 2 (0)| 00:00:01 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- ......
從執行計劃中可以看出走的是并行。
取消當前session并行使用如下語句alter session disable parallel query;
scott@TEST>alter session disable parallel query; Session altered. scott@TEST>select * from emp; 14 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3956160932 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| EMP | 14 | 1218 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- ......
4、11gR2的自動并行
Oracle在11gR2中引入了自動并行(Auto DOP),自動并行的開啟受參數parallel_degree_policy的控制,其默認值為MANUAL,即自動并行在默認情況下并沒有開啟。如果通過更改PARALLEL_DEGREE_POLICY的值而開啟了自動并行,那么后面執行的SQL的執行方式是串行還是并行,以及并行執行的并行度是多少等,就都是由Oracle自動來決定了。
scott@TEST>select table_name,degree from user_tables where table_name in ('EMP','EMP_TEMP'); TABLE_NAME DEGREE ------------------------------------------------------------------------------------------ ------------------------------------------------------------ EMP 1 EMP_TEMP 1 scott@TEST>alter session set parallel_degree_policy=AUTO; Session altered. scott@TEST>set autotrace traceonly scott@TEST>select * from emp; 14 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 3956160932 -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1218 | 3 (0)| 00:00:01 | | 1 | TABLE ACCESS FULL| EMP | 14 | 1218 | 3 (0)| 00:00:01 | -------------------------------------------------------------------------- ...... scott@TEST>select * from emp_temp; 1835008 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 2661083444 -------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | -------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1835K| 66M| 1683 (1)| 00:00:21 | | | | | 1 | PX COORDINATOR | | | | | | | | | | 2 | PX SEND QC (RANDOM)| :TQ10000 | 1835K| 66M| 1683 (1)| 00:00:21 | Q1,00 | P->S | QC (RAND) | | 3 | PX BLOCK ITERATOR | | 1835K| 66M| 1683 (1)| 00:00:21 | Q1,00 | PCWC | | | 4 | TABLE ACCESS FULL| EMP_TEMP | 1835K| 66M| 1683 (1)| 00:00:21 | Q1,00 | PCWP | | -------------------------------------------------------------------------------------------------------------- ......
從上面的輸出可以看出表EMP和EMP_TEMP的并行度都為1,但是兩個表的數據量相關很大,EMP只有14條數據,EMP_TEMP有1835008條數據。在執行時Oracle選擇的執行方式就有不同,EMP是串行執行,而EMP_TEMP為并行執行。
參考《基于Oracle的SQL優化》
官方文檔:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2013.htm#i2231814
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。