並行執行是同時開啓多個進程/線程來完成同一個任務,並行執行的每個進程/線程都會消耗額外的硬件資源,因此並行執行的本質就是以額外的硬件資源消耗來換取執行時間的縮短。這裏的額外硬件資源消耗是指對數據庫服務器上多個CPU、內存、從個I/O通道,甚至是RAC環境下多個數據庫節點的額外利用。算法
下面總結一下Oracle裏開啓並行的幾種方法sql
一、更改目標表的並行度數據庫
有兩種方法修改目標表的並行度服務器
alter table table_name parallel;session
alter table table_name parallel n;oracle
其中方法1 是把指定表的並行度修改成默認值,方法2是把指定表的並行度修改成n;ide
查看錶EMP當前的並行度爲1優化
scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP 1
想用默認的並行度去訪問表EMP
spa
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
二、使用並行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 | | --------------------------------------------------------------------------------------------------------------
從上面的執行計劃中能夠看出,走的是並行
三、使用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 | -------------------------------------------------------------------------- ......
四、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