Oracle中並行parallel詳解

2021-09-20 03:06:29 字數 2386 閱讀 7305

1. 例項

(1)insert 加速

2. 用途

強行啟用並行度來執行當前sql。這個在oracle 9i之後的版本可以使用,之前的版本現在沒有環境進行測試。也就是說,加上這個說明,可以強行啟用oracle的多執行緒處理功能。舉例的話,就像電腦裝了多核的cpu,但大多情況下都不會完全多核同時啟用(2核以上的比較明顯),使用parallel說明,就會多核同時工作,來提高效率。

但本身啟動這個功能,也是要消耗資源與效能的。所有,一般都會在返回記錄數大於100萬時使用,效果也會比較明顯。

3. 語法

/*+parallel(table_short_name,cash_number)*/

這個可以加到insert、delete、update、select的後面來使用(和rule的用法差不多,有機會再分享rule的用法)

開啟parallel功能的語句是:

alter session enable parallel dml;

這個語句是dml語句哦,如果在程式中用,用execute的方法開啟。

4. 例項說明

用erp中的transaction來說明下吧。這個table記錄了所有的transaction,而且每天資料量也算相對比較大的(根據企業自身業務量而定)。假設我們現在要檢視對比去年一年當中每月的進、銷情況,所以,一般都會寫成:

select to_char(transaction_date,'yyyymm') txn_month,

sum(

decode(

sign(transaction_quantity),1,transaction_quantity,0

)) in_qty,

sum(

decode(

sign(transaction_quantity),-1,transaction_quantity,0

)) out_qty

from mtl_material_transactions mmt

where transaction_date >= add_months(

to_date(    

to_char(sysdate,'yyyy')||'0101','yyyymmdd'),

-12)

and transaction_date <= add_months(

to_date(

to_char(sysdate,'yyyy')||'1231','yyyymmdd'),

-12)

group by to_char(transaction_date,'yyyymm') 

這個sql執行起來,如果transaction_date上面有加index的話,效率還算過的去;但如果沒有加index的話,估計就會半個小時內都執行不出來。這是就可以在select 後面加上parallel說明。例如:

select /*+parallel(mmt,10)*/

to_char(transaction_date,'yyyymm') txn_month,

...這樣的話,會大大提高執行效率。如果要將檢索出來的結果insert到另乙個表tmp_count_tab的話,也可以寫成:

insert /*+parallel(t,10)*/

into tmp_count_tab

(txn_month,

in_qty,

out_qty

)select /*+parallel(mmt,10)*/

to_char(transaction_date,'yyyymm') txn_month,

...插入的機制和檢索機制差不多,所以,在insert後面加parallel也會加速的。關於insert機制,這裡暫不說了。

parallel後面的數字,越大,執行效率越高。不過,貌似跟server的配置還有oracle的配置有關,增大到一定值,效果就不明顯了。所以,一般用8,10,12,16的比較常見。我試過用30,發現和16的效果一樣。不過,數值越大,占用的資源也會相對增大的。如果是在一些package、function or procedure中寫的話,還是不要寫那麼大,免得占用太多資源被dba開k。

5. parallel也可以用於多表

多表的話,就是在第一後面,加入其他的就可以了。具體寫法如下:

/*+parallel(t,10) (b,10)*/

6. 小結

關於執行效率,建議還是多按照index的方法來提高效果。oracle有自帶的explan road的方法,在執行之前,先看下執行計畫路線,對寫好的sql tuned之後再執行。實在沒辦法了,再用parallel方法。parallel比較**,對開發者而言,不是好東西,會養成不好習慣,導致很多bad sql不會暴漏,sql tuning的能力得不到提公升。我有見過某些人create table後,從不create index或primary key,認為寫sql時加parallel就可以了。

Oracle 並行查詢

並行查詢允許將乙個sql select語句劃分為多個較小的查詢,每個部分的查詢併發地執行,然後會將各個部分的結果組合起來,提供最終的答案。我們來看乙個例子 1.執行如下一串sql語句,建立乙個叫big table的表,期間會讓你錄入1的值 想要往big table表裡面插入多少行資料 我錄入的是10...

ORACLE並行操作

並行處理一般都會涉及到訪問磁碟,如果資料不是分布在多個磁碟上,使用peo將會造成i o瓶頸。在很小的表或者非常快速的查詢中使用並行操作會降低效能。當並行度被設定成n,並行操作總共就需要 2 n 1個程序。建立表時,可以指定該錶可以使用的並行度dop degree of parallelism cre...

Oracle 並行查詢

所謂並行執行,是指能夠將乙個大型序列任務 任何dml,一般的ddl 物理的劃分為叫多個小的部分,這些較小的部分可以同時得到處理。何時使用並行執行 1 必須有乙個非常大的任務 2 必須有充足的資源 cpu,i o,memory alter table test a parallel 告訴oracel,...