关于Oracle parallel(并行)的几个基本常识
1、什么時(shí)候使用并行?
常見的場(chǎng)景有:
a)
????普通SQL最常見的情況就是大表的全表掃描,還有就是大的索引的快速全掃描(注意,index?fast?full scan可以使用并行,index full scan 不能使用并行)。
????需要糾正一個(gè)誤區(qū):SQL執(zhí)行慢就可以通過(guò)使用并行或是增加并行來(lái)提高速度。
????正解:并行能否發(fā)揮作用要看SQL的具體執(zhí)行計(jì)劃,比如標(biāo)量子查詢或是DB link,增大并行帶來(lái)的性能提升是微乎其微的!
????多大的表算大表?
????至少要百萬(wàn)級(jí)以上記錄的表吧。如果幾億甚至十幾億記錄數(shù)的表全表掃描不使用并行,SQL的執(zhí)行時(shí)間會(huì)相當(dāng)長(zhǎng),特別是表在SQL執(zhí)行的過(guò)程中如果還有其他session的DML操作的時(shí)候。
????OLTP系統(tǒng)的正常事務(wù)一般不會(huì)使用大表全掃描的執(zhí)行計(jì)劃,如果有一些統(tǒng)計(jì)分析的業(yè)務(wù),建議在系統(tǒng)資源相對(duì)空閑的時(shí)候開啟并行。
b)
????用create table As Select創(chuàng)建一張大表,如
????create table test?parallel 16?as select .... from t1,t2 where .....;
????alter table test?noparallel;
c)
????創(chuàng)建或重建索引
????create index idx_test on table_A(name)?parallel 8;
??? alter index idx_test?noparallel;
d)
????大表收集統(tǒng)計(jì)信息,可以設(shè)置并行,如degree=>8
????其他不常見的操作還有表壓縮等,一些比較耗時(shí)的分區(qū)操作也可以查查語(yǔ)法,看看是否支持并行操作。
2、并行度的選擇
????一般使用2的冪作為并行度,如2、4、8、16等,正常情況并行度不要設(shè)置太高,建議最多不要超過(guò)32。當(dāng)然,特殊情況特殊對(duì)待,強(qiáng)悍的系統(tǒng)(比如exadata),如果需要非常高的響應(yīng)速度,并行度再多個(gè)幾倍也不是問(wèn)題。并行高的時(shí)候并發(fā)就要減少,否則可能會(huì)耗光并行資源。
3、并行hint的寫法
????通常我們都會(huì)使用hint在SQL級(jí)別設(shè)置并行,一般不在表上和索引上設(shè)置并行度,所以我們上面并行創(chuàng)建表和索引的例子,后面都伴隨著一個(gè)noparallel,如果在創(chuàng)建表或索引時(shí)使用了并行,要把它改成noparallel或parallel 1 :
????alter table/index table_name/index_name noparallel/parallel 1;
Hint的寫法在10g和11g+有很大差別,11g+就方便很多。
10g 及以下:
????每個(gè)需要并行的表都要指定并行,如 /*+ parallel(a 4) parallel(b 4) */ ?,如果SQL涉及的表較多,那么hint會(huì)比較長(zhǎng);如果內(nèi)聯(lián)視圖較多,經(jīng)常會(huì)出來(lái)遺漏的情況。如果某個(gè)表沒(méi)有指定并行,那么就只能串行,如果某個(gè)大表忘了寫,就會(huì)出現(xiàn)性能瓶頸。
11g+:
????只要在整個(gè)sql的任何一個(gè)關(guān)鍵字(select、update、insert、delete、merge)后面出現(xiàn)一次parallel(n),那么整個(gè)SQL相關(guān)的表,都會(huì)使用并行,在寫法上非常的簡(jiǎn)潔,而且不會(huì)遺漏。現(xiàn)在新開發(fā)的應(yīng)用都應(yīng)該是11gR2以上了,忘了10g的寫法吧。
?注意:
/*+ parallel */ 或 /*+ parallel 8 */是錯(cuò)誤的并行hint寫法,這些不正確的寫法會(huì)導(dǎo)致SQL使用一個(gè)比較大的并行度,消耗大量的系統(tǒng)資源。
????
4、并行DML
????DML有4種,INSERT、DELETE、UPDATE還有MERGE,如:
????insert /*+ parallel(4) */ into t1 select .... from ....;
這個(gè)寫法將會(huì)在select部分使用并行度為4的并行,DML部分的并行并沒(méi)有真正的啟用,DML的并行默認(rèn)是關(guān)閉的,如果需要使用,必須在session級(jí)別通過(guò)下面命令開啟:
????alter session enable parallel dml;--推薦寫法
????或者alter session force parallel dml parallel?n; --用force的語(yǔ)法,可以使下面的dml即使不用parallel的hint,也會(huì)使用并行度為n的并行。
執(zhí)行這個(gè)命令后,才真正開啟了DML的并行。
注意:
開啟了DML的并行后,接下來(lái)的DML語(yǔ)句將會(huì)產(chǎn)生一個(gè)表鎖,在commit之前,當(dāng)前session 不能對(duì)該表做查詢和dml操作,其他session也不能對(duì)該表做DML操作。
所以建議,并行dml語(yǔ)句,應(yīng)該在語(yǔ)句執(zhí)行后立即commit; 然后再關(guān)閉并行dml,完整的過(guò)程應(yīng)該是:
alter session enable parallel dml;
your dml;
commit;
alter session disable parallel dml;
或者alter session force parallel dml parallel 1;
補(bǔ)充:
????parallel 的hint并不能保證sql一定會(huì)使用并行,如果優(yōu)化器認(rèn)為sql使用索引更高效,可能會(huì)使用索引而不使用并行。如果要確保SQL使用并行,有時(shí)可能要結(jié)合full 的hint,這種情況不多見。
總結(jié)
以上是生活随笔為你收集整理的关于Oracle parallel(并行)的几个基本常识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2013 NMPD展示预览,第1部分
- 下一篇: 华为荣耀手表GS3 评测怎么样