并行執(zhí)行是同時開啟多個進(jìn)程/線程來完成同一個任務(wù),并行執(zhí)行的每一個進(jìn)程/線程都會消耗額外的硬件資源,所以并行執(zhí)行的本質(zhì)就是以額外的硬件資源消耗來換取執(zhí)行時間的縮短。這里的額外硬件資源消耗是指對數(shù)據(jù)庫服務(wù)器上多個CPU、內(nèi)存、從個I/O通道,甚至是RAC環(huán)境下多個數(shù)據(jù)庫節(jié)點(diǎn)的額外利用。
為寧晉等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及寧晉網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、寧晉網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
下面總結(jié)一下Oracle里開啟并行的幾種方法
1、更改目標(biāo)表的并行度
有兩種方法修改目標(biāo)表的并行度
alter table table_name parallel;
alter table table_name parallel n;
其中方法1 是把指定表的并行度修改為默認(rèn)值,方法2是把指定表的并行度修改為n;
查看表EMP當(dāng)前的并行度為1
scott@TEST>select table_name,degree from user_tables where table_name='EMP'; TABLE_NAME DEGREE ------------------------------ ---------- EMP 1
想用默認(rèn)的并行度去訪問表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 | | -------------------------------------------------------------------------------------------------------------- .....
從上面的執(zhí)行計劃中可以看出,走的是對表EMP的全表掃描,PX...表示的就是走的并行
默認(rèn)并行度的算法如下:
默認(rèn)并行度=parallel_threads_per_cpu*cpu_count
如果想對表開啟8個并行度則執(zhí)行: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默認(rèn)并行度
2) /*+ noparallel(table) */ #對指定表不使用并行訪問
3) /*+ parallel_index(table[,index[,degree]]) */ #對指定的分區(qū)索引以指定的并行度去做并行范圍掃描
4) /*+ no_parallel_index(table[,index]) */ #對指定的分區(qū)索不使用并行訪問
5) /*+ pq_distribute(table,out,in) */ #對指定表以out/in所指定的方式來傳遞數(shù)據(jù),這里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執(zhí)行上之前的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 | | --------------------------------------------------------------------------------------------------------------
從上面的執(zhí)行計劃中可以看出,走的是并行
3、使用alter session命令
使用alter session命令,可以在當(dāng)前session中強(qiáng)制啟用并行查詢或并行DML。如果強(qiáng)制啟用了并行查詢或者并行DML,那就意味著從執(zhí)行alter session命令強(qiáng)制開啟并行的那個時間點(diǎn)開始,在這個session中隨后執(zhí)行的所有SQL都將以并行的方式執(zhí)行,有如下四種方法在當(dāng)前session中強(qiáng)制開啟并行
1) alter session parallel query
在當(dāng)前session中強(qiáng)制開啟并行查詢,沒有指定并行度,Oracle使用默認(rèn)并行度
2) alter session parallel query parallel n
在當(dāng)前session中強(qiáng)制開啟并行查詢,并且指定并行度為n
3) alter session parallel dml
在當(dāng)前session中強(qiáng)制開啟并行DML,沒有指定并行度,Oracle使用默認(rèn)并行度
4) alter session parallel dml parallel n
在當(dāng)前session中強(qiáng)制開啟并行DML,并且指定并行度為n
表EMP并行度仍為1,在session中強(qiáng)制開啟并行:
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 | | -------------------------------------------------------------------------------------------------------------- ......
從執(zhí)行計劃中可以看出走的是并行。
取消當(dāng)前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),自動并行的開啟受參數(shù)parallel_degree_policy的控制,其默認(rèn)值為MANUAL,即自動并行在默認(rèn)情況下并沒有開啟。如果通過更改PARALLEL_DEGREE_POLICY的值而開啟了自動并行,那么后面執(zhí)行的SQL的執(zhí)行方式是串行還是并行,以及并行執(zhí)行的并行度是多少等,就都是由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,但是兩個表的數(shù)據(jù)量相關(guān)很大,EMP只有14條數(shù)據(jù),EMP_TEMP有1835008條數(shù)據(jù)。在執(zhí)行時Oracle選擇的執(zhí)行方式就有不同,EMP是串行執(zhí)行,而EMP_TEMP為并行執(zhí)行。
參考《基于Oracle的SQL優(yōu)化》
官方文檔:http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_2013.htm#i2231814
當(dāng)前名稱:Oracle開啟并行的幾種方法
網(wǎng)頁地址:http://chinadenli.net/article8/pigjop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、全網(wǎng)營銷推廣、電子商務(wù)、動態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)