溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle并行查詢介紹以及測試效果

發(fā)布時間:2021-07-16 00:35:13 來源:億速云 閱讀:4918 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“Oracle并行查詢介紹以及測試效果”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Oracle并行查詢介紹以及測試效果”吧!

并行概念

所謂并行執(zhí)行,是指能夠?qū)⒁粋€大型串行任務(wù)(任何DML,一般的DDL)物理的劃分為叫多個小的部分,這些較小的部分可以同時得到處理。

何時使用并行執(zhí)行:
1、必須有一個非常大的任務(wù)

2、必須有充足的資源(CPU,I/O,MEMORY)

并行查詢

并行查詢允許將一個SQL SELECT 語句劃分為多個較小的查詢,每個查詢并發(fā)的運(yùn)行。最后將每個較小查詢得到的結(jié)果組合起來,得到最終結(jié)果。

啟動并行查詢幾種方式:
1、在查詢中使用一個hint提示:

select /*+ parallel(4)  */  count(*)  from test_a ;---指定一個并行度為4的并行查詢。
2、利用alter table修改表:

alter table test_a parallel 4;--告訴oracle,在創(chuàng)建這個表的執(zhí)行計劃時,使用并行度4。

數(shù)據(jù)測試

昨天自己在PL/SQL里面自己做了一下測試,我們先看看,我的數(shù)據(jù)庫表里tskuplu表有24548條記錄。

首先我先用正常查詢的方法,查詢所有的出來后發(fā)現(xiàn)是103秒,如圖:

Oracle并行查詢介紹以及測試效果

然后我再用并行查詢的方法,設(shè)置為3進(jìn)程后查詢,耗時85秒。如圖:

Oracle并行查詢介紹以及測試效果

到這時我瞬間覺得一下子節(jié)省了接近18秒的時候,覺得真不錯,不過我后來又用普通查詢再查一次的時候,也是80多秒,瞬間心情不好了。為了再驗證一下并行查詢,今天我又開始進(jìn)行了一下測試。

我們今天先運(yùn)行并行查詢看看效果,79秒。

Oracle并行查詢介紹以及測試效果

然后再執(zhí)行了一下普通的查詢,結(jié)果時間也差不多,這里我就沒放圖,在想這個并行查詢是不是沒有執(zhí)行的原因 ,于是我們就改了下另一種方式,把表結(jié)構(gòu)修改了下,

Oracle并行查詢介紹以及測試效果

通過上面修改了表的自動并行查詢方法,我們直接用普通查詢看看查詢的效果,結(jié)果是97秒

Oracle并行查詢介紹以及測試效果

通過v$px_process查詢后發(fā)現(xiàn)并行也已經(jīng)執(zhí)行了,但是結(jié)果并不令人滿意。

Oracle并行查詢介紹以及測試效果

結(jié)論

通過上面的測試,我覺得可能我的測試機(jī)器也有一定的問題,所以來說并行查詢并沒有對查詢有實(shí)質(zhì)性的提高,本來我覺得如果有實(shí)質(zhì)性的提高,那樣我接下來要做的程序中可以考慮用并行查詢提出所有,再通過緩存處理,現(xiàn)在來看,還是用自己寫的分頁查詢來實(shí)現(xiàn)比較合適。

總結(jié)一下并行查詢的常見問題(摘自網(wǎng)上)

1、看看并行選件是否安裝
Select * FROM V$OPTION
where parameter like 'Parallel%';
看看
Parallel execution是不是TRUE


2、如果是TRUE,執(zhí)行語句后查看
select * from V$pq_sesstat;
where name like '%Parallelized';

如果Queries Parallelized>>0就說明是執(zhí)行了并行


3、可以強(qiáng)制使用PARALLEL,和CPU數(shù)量無關(guān),不過在單個CPU下使用并行沒有什么好處
alter session force parallel query;


4、你是怎么知道語句沒有使用PARALLEL?
如果你用EXPLAIN ,那么有兩個腳本看執(zhí)行計劃UTLXPLS.UTLXPLP前一個是看串行計劃的,后一個才能看到并行計劃,如果你使用SET AUTOTRACE,那么你如果看到P->S,那么說明計劃已經(jīng)是并行的了。

1.與并行查詢有關(guān)的參數(shù)有哪些?

parallel_adaptive_multi_user boolean 
啟用或禁用一個自適應(yīng)算法,旨在提高使用并行執(zhí)行方式的多用戶環(huán)境的性能。通過按系統(tǒng)負(fù)荷自動降低請求的并行度,在啟動查詢時實(shí)現(xiàn)此功能。當(dāng) PARALLEL_AUTOMATIC_TUNING = TRUE 時,其效果最佳。 
TRUE | FALSE 如果 PARALLEL_AUTOMATIC_TUNING = TRUE,則該值為 TRUE;否則為 FALSE 

parallel_automatic_tuning boolean 
如果設(shè)置為 TRUE,Oracle 將為控制并行執(zhí)行的參數(shù)確定默認(rèn)值。除了設(shè)置該參數(shù)外,你還必須為系統(tǒng)中的表設(shè)置并行性。 TRUE | FALSE FALSE 

parallel_execution_message_size integer 
指定并行執(zhí)行 (并行查詢、PDML、并行恢復(fù)和復(fù)制) 消息的大小。如果值大于 2048 或 4096,就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING =TRUE,將在大存儲池之外指定消息緩沖區(qū)。 
2148 - 無窮大。 如果 PARALLEL_AUTOMATIC_TUNING 為 FALSE,通常值為 2148;如果PARALLEL_AUTOMATIC_TUNING 為 TRUE ,則值為 4096 (根據(jù)操作系統(tǒng)而定)。

parallel_max_servers integer 
指定一個例程的并行執(zhí)行服務(wù)器或并行恢復(fù)進(jìn)程的最大數(shù)量。如果需要,例程啟動時分配的查詢服務(wù)器的數(shù)量將增加到該數(shù)量。 
0 -256 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 確定 

parallel_min_percent integer 
指定并行執(zhí)行要求的線程的最小百分比。設(shè)置該參數(shù),可以確保并行執(zhí)行在沒有可用的恰當(dāng)查詢從屬時,會顯示一個錯誤消息,并且該查詢會因此而不予執(zhí)行。

parallel_min_servers integer 
指定為并行執(zhí)行啟動例程后,Oracle 創(chuàng)建的查詢服務(wù)器進(jìn)程的最小數(shù)量。 
0 - PARALLEL_MAX_SERVERS。

parallel_threads_per_cpu integer 
說明一個 CPU 在并行執(zhí)行過程中可處理的進(jìn)程或線程的數(shù)量,并優(yōu)化并行自適應(yīng)算法和負(fù)載均衡算法。如果計算機(jī)在執(zhí)行一個典型查詢時有超負(fù)荷的跡象,應(yīng)減小該數(shù)值 
任何非零值。 根據(jù)操作系統(tǒng)而定 (通常為 2) 

2.當(dāng)前時刻有那些并行查詢在跑?
14:13:46 SQL> desc v$px_session
名稱 是否為空? 類型
----------------------------------------- -------- ------------------
SADDR RAW(4)
SID NUMBER
SERIAL# NUMBER
QCSID NUMBER
QCSERIAL# NUMBER
QCINST_ID NUMBER
SERVER_GROUP NUMBER
SERVER_SET NUMBER
SERVER# NUMBER
DEGREE NUMBER
REQ_DEGREE NUMBER

3.怎么才能讓查詢有并行執(zhí)行?
如果建表時指定了并行度,例:
Create TABLE LI2.PAR_T
(
a VARCHAR2 (5)
)
PARALLEL 5;
那么對該表做全表掃描時就會并行
14:26:05 SQL> set autot on
14:26:11 SQL> select * from par_t;
未選定行
已用時間: 00: 00: 00.02
Execution Plan
----------------------------------------------------------
0 Select STATEMENT Optimizer=CHOOSE (Cost=1 Card=82 Bytes=328)
1 0 TABLE ACCESS* (FULL) OF 'PAR_T' (Cost=1 Card=82 Bytes=328) :Q6000

1 PARALLEL_TO_SERIAL Select /*+ NO_EXPAND ROWID(A1) */ A1."A" FRO
M "PAR_T" PX_GRANULE(0, BLOCK_RANGE,
如果該表沒有指定并行度,可以在查詢時用hint 實(shí)現(xiàn),例:
select /*+ full(t) parallel(t,5) */ * from your_table t where ...;

4.為什么本該并行執(zhí)行的查詢沒有并行執(zhí)行呢?
系統(tǒng)的并行度由parallel_max_servers 決定,如果它的并行度為5.如果有一個并行度為5的查詢在跑,那么系統(tǒng)在這條查詢運(yùn)行完成前是不能再跑并行查詢的,該并行查詢將會以非并行方式運(yùn)行.

5如果有并行度低于系統(tǒng)最大并行數(shù)的查詢在跑,那接下來的并行查詢會怎么跑呢?
When you specify parallel degree 4 oracle tries to allocate 4 producer slaves and 4 consumer slaves. The producers can feed any of the consumers. 
If there are only 2 slaves available then we use these. 
If there is only 1 slave available then we go serial 
If there are none available then we use serial. 
If parallel_min_percent is set then we error ora 12827 instead of using a lower number of slaves or going serial

6.設(shè)定parallel_max_servers 多大為好?
在多CPU的環(huán)境中,一般把CPU-1或CPU的數(shù)量做個最大并行數(shù),因為并行查詢運(yùn)行時還需要一個進(jìn)程協(xié)調(diào)各并行進(jìn)程.對于單CPU沒什么好說的.

7.并行查詢能提高系統(tǒng)的性能嗎?
并行查詢運(yùn)行時,很容易會使機(jī)器運(yùn)行在高負(fù)荷下,令系統(tǒng)對其它事務(wù)的處理時間大大加長.并行查詢一般適合在非業(yè)務(wù)高峰值人工執(zhí)行,并不適合在程序中指定運(yùn)行并行查詢.
PINNER:
并行不等于快速,僅僅是適合在數(shù)據(jù)倉庫環(huán)境,低業(yè)務(wù)請求與低并發(fā)操作的時候
典型的OLTP系統(tǒng),如果我們的系統(tǒng),是絕對不允許并行查詢出現(xiàn)的。

感謝各位的閱讀,以上就是“Oracle并行查詢介紹以及測試效果”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Oracle并行查詢介紹以及測試效果這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI