溫馨提示×

溫馨提示×

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

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

oracle parallel 并行 設(shè)置 理解

發(fā)布時(shí)間:2020-09-24 13:14:57 來源:網(wǎng)絡(luò) 閱讀:8374 作者:liqiang_yang 欄目:關(guān)系型數(shù)據(jù)庫

引子:以前一直沒太關(guān)注oracle并行這個(gè)特性。前幾天一個(gè)兄弟碰到的一個(gè)問題,才讓我覺得這個(gè)東西還是有很多需要注意的地方,有必要仔細(xì)熟悉下。其實(shí)碰到的問題不復(fù)雜:
類似如下的一條語句:insert into xxxx select /+parallel(a) / * from xxx a;數(shù)據(jù)量大約在75G左右,這位兄弟從上午跑到下午還沒跑完,過來問我咋回事,說平常2hrs能跑完的東西跑了好幾個(gè)小時(shí)還撒動(dòng)靜。查看系統(tǒng)性能也比較 正常,cpu,io都不繁忙,平均READ速度在80M/s左右(勉強(qiáng)湊合),但平均寫速度只有10M不到。等待事件里面大量的‘ ‘PX Deq Credit: send blkd’,這里能看出并行出了問題,從而最后得知是并行用法有問題,修改之后20分鐘完成了該操作。正確的做法應(yīng)該是:
alter session enable dml parallel;

insert /+parallel(xxxx,4) / into xxxx select /+parallel(a) / * from xxx a;

因?yàn)閛racle默認(rèn)并不會(huì)打開PDML,對DML語句必須手工啟用。 另外不得不說的是,并行不是一個(gè)可擴(kuò)展的特性,只有在數(shù)據(jù)倉庫或作為DBA等少數(shù)人的工具在批量數(shù)據(jù)操作時(shí)利于充分利用資源,而在OLTP環(huán)境下使用并行 需要非常謹(jǐn)慎。事實(shí)上PDML還是有比較多的限制的,例如不支持觸發(fā)器,引用約束,高級復(fù)制和分布式事務(wù)等特性,同時(shí)也會(huì)帶來額外的空間占用,PDDL同 樣是如此。有關(guān)Parallel excution可參考官方文檔,在Thomas Kyte的新書《Expert Oracle Database architecture》也有精辟的講述。

………………………………………………………………………………………………………………
………………………………………………………………………………………………………………

我在其中一個(gè)SESSION 執(zhí)行
SQL> create table test3 parallel 4 as select * from test1;

表已創(chuàng)建。

SQL> select * from v$mystat where rownum=1;

   SID STATISTIC#      VALUE

   151          0          1

SQL>

然后立刻在另一SESSION 乘上一個(gè)執(zhí)行沒結(jié)束,看下面,這么說是有4個(gè)并行的進(jìn)程在處理了
SQL> select * from v$px_session;

SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE


6D31E434 131 16 151 107 1 1 1 1 4 4
6D32421C 136 11 151 107 1 1 1 2 4 4
6D3267AC 138 18 151 107 1 1 1 3 4 4
6D31F6FC 132 11 151 107 1 1 1 4 4 4
6D335BD4 151 107 151

SQL> select * from v$mystat where rownum=1;

   SID STATISTIC#      VALUE

   137          0          1

SQL>

我加大后

SQL> /

SADDR SID SERIAL# QCSID QCSERIAL# QCINST_ID SERVER_GROUP SERVER_SET SERVER# DEGREE REQ_DEGREE


6D31864C 126 10 151 107 1 1 1 1 7 10
6D31F6FC 132 17 151 107 1 1 1 2 7 10
6D32421C 136 15 151 107 1 1 1 3 7 10
6D3267AC 138 22 151 107 1 1 1 4 7 10
6D322F54 135 11 151 107 1 1 1 5 7 10
6D31E434 131 18 151 107 1 1 1 6 7 10
6D327A74 139 5 151 107 1 1 1 7 7 10
6D335BD4 151 107 151

已選擇8行。

SQL>

奇怪,怎么看只有7個(gè),我那里可是寫成
SQL> create table test4 parallel 10 as select * from test1;

表已創(chuàng)建。

怎么少了3個(gè)?

不過我實(shí)際只有一個(gè)CPU的機(jī)器,這些說明什么問題呢?

BTW

SQL> SHOW Parameter parallel_max

NAME TYPE VALUE


parallel_max_servers integer 20
SQL>

……………………………………………………………………………………………………………………
……………………………………………………………………………………………………………………
開多少個(gè)parallel server也要看當(dāng)時(shí)系統(tǒng)的負(fù)載,并行是很耗系統(tǒng)資源的,

這個(gè)并行度和你初始化參數(shù)有關(guān)。CPU_COUNT 、PARALLEL_THREADS_PER_CPU 等等都有關(guān)系。如果你建表的時(shí)候沒有明確指定并行度,那么oracle會(huì)自動(dòng)的根據(jù)需要設(shè)定并行度。

用Oracle并行查詢發(fā)揮多CPU的威力
在一個(gè)單獨(dú)的服務(wù)器中安裝更多的CPU成為目前的一個(gè)趨勢。使用對稱多處理服務(wù)器(SMP)的情況下,一個(gè)Oracle服務(wù)器擁有8個(gè)、16個(gè)或32個(gè)CPU以及幾吉比特RAM的SGA都不足為奇。

Oracle跟上了硬件發(fā)展的步伐,提供了很多面向多CPU的功能。從Oracle8i開始,Oracle在每個(gè)數(shù)據(jù)庫函數(shù)中都實(shí)現(xiàn)了并行性,包括SQL訪問(全表檢索)、并行數(shù)據(jù)操作和并行恢復(fù)。對于Oracle專業(yè)版的挑戰(zhàn)是為用戶的數(shù)據(jù)庫配置盡可能多的CPU。

在Oracle環(huán)境中實(shí)現(xiàn)并行性最好的方法之一是使用Oracle并行查詢(OPQ)。我將討論OPQ是如何工作的和怎樣用它來提升大的全表檢索的響應(yīng)時(shí)間以及調(diào)用并行事務(wù)回滾等等。

使用OPQ

當(dāng)在Oracle中進(jìn)行一次合法的、大型的全表檢索時(shí),OPQ能夠極大地提高響應(yīng)時(shí)間。通過OPQ,Oracle將表劃分成如圖A所示的邏輯塊。

圖 A

由OPQ劃分的表

一旦表被劃分成塊,Oracle啟用并行的子查詢(有時(shí)稱為雜務(wù)進(jìn)程),每個(gè)子查詢同時(shí)讀取一個(gè)大型表中的一塊。所有子查詢完畢以后,Oracle將結(jié)果會(huì)傳給并行查詢調(diào)度器,它會(huì)重新安排數(shù)據(jù),如果需要?jiǎng)t進(jìn)行排序,并且將結(jié)果傳遞給最終用戶。OPQ具有無限的伸縮性,因此,以前需要花費(fèi)幾分鐘的全表檢索現(xiàn)在的響應(yīng)時(shí)間卻不到1秒。

OPQ嚴(yán)重依賴于處理器的數(shù)量,通過并行運(yùn)行之所以可以極大地提升全表檢索的性能,其前提就是使用了N-1個(gè)并行進(jìn)程(N=Oracle服務(wù)器上CPU的數(shù)量)。

必須注意非常重要的一點(diǎn),即Oracle9i能夠自動(dòng)檢測外部環(huán)境,包括服務(wù)器上CPU的數(shù)量。在安裝時(shí),Oracle9i會(huì)檢查服務(wù)器上CPU的數(shù)量,設(shè)置一個(gè)名為cpu_count的參數(shù),并使用cpu_count作為默認(rèn)的初始化輸入?yún)?shù)。這些初始化參數(shù)會(huì)影響到Oracle對內(nèi)部查詢的處理。

下面就是Orale在安裝時(shí)根據(jù)cpu_count而設(shè)置的一些參數(shù):

fast_start_parallel_rollback

parallel_max_servers

log_buffer

db_block_lru_latches

參數(shù)

讓我們進(jìn)一步看看CPU的數(shù)量是如何影響這些參數(shù)的。

參數(shù)fast_start_parallel_rollback

Oracle并行機(jī)制中一個(gè)令人興奮之處是在系統(tǒng)崩潰時(shí)調(diào)用并行回滾得能力。當(dāng)Oracle數(shù)據(jù)庫發(fā)生少有的崩潰時(shí),Oracle能自動(dòng)檢測未完成的事務(wù)并回滾到起始狀態(tài)。這被稱為并行熱啟動(dòng),而Oracle使用基于cpu_count的fast_start_parallel_rollback參數(shù)來決定未完成事務(wù)的秉性程度。

并行數(shù)據(jù)操縱語言(DML)恢復(fù)能夠在Oracle數(shù)據(jù)庫崩潰后極大地加快其重新啟動(dòng)的速度。此參數(shù)的默認(rèn)值是系統(tǒng)CPU數(shù)量的兩倍,但是一些DBA們認(rèn)為應(yīng)該將這個(gè)值設(shè)置為cpu_count的四倍。

參數(shù)parallel_max_servers_parameter

Oracle一個(gè)顯著的加強(qiáng)是自動(dòng)決定OPQ并行的程度。由于Oracle清楚服務(wù)器中CPU的數(shù)量,它會(huì)自動(dòng)分配合適的子進(jìn)程的數(shù)量來提升并行查詢的響應(yīng)時(shí)間。當(dāng)然,會(huì)有其它的外部因素,比如表的劃分以及磁盤輸入/輸出子系統(tǒng)的布局等,但是根據(jù)cpu_count來設(shè)置parallel_max_servers參數(shù)將給Oracle一個(gè)合理的依據(jù)來選擇并行的程度。

由于Oracle的并行操作嚴(yán)重依賴服務(wù)器上CPU的數(shù)量,parallel_max_servers會(huì)被設(shè)置成服務(wù)器上CPU的數(shù)量。如果在一臺服務(wù)器上運(yùn)行多個(gè)實(shí)例,則默認(rèn)值太大了,會(huì)導(dǎo)致過度的頁面交換和嚴(yán)重的CPU負(fù)擔(dān)。并行的程度還依賴于目標(biāo)表中分區(qū)的數(shù)量,因此parallel_max_servers應(yīng)該設(shè)置成足夠大以允許Oracle為每個(gè)查詢選擇最佳數(shù)量的并行子查詢。

參數(shù)log_buffer

參數(shù)log_buffer定義了供即刻寫入redo日志信息的保留RAM的數(shù)量,這個(gè)參數(shù)受cpu_count的影響。Oracle推薦log_buffer最大為cpu_count乘以500KB或128KB。CPU的數(shù)量對于log_buffer來說非常重要,因?yàn)镺racle會(huì)生成多日志寫入(LGWR)進(jìn)程來異步釋放redo信息。

log_buffer是Oracle中最易誤解的的RAM參數(shù)之一,通常存在下面幾個(gè)配置錯(cuò)誤:

log_buffer被設(shè)置得太高(例如,大于1MB),這回引起性能問題,因?yàn)榇笕萘康慕Y(jié)果會(huì)使得寫入同步進(jìn)行(例如,日志同步等待事件非常高)。

log_buffer不是db_block_size的倍數(shù)。在的Oracle9i中,log_buffer應(yīng)該是2048字節(jié)的倍數(shù)。

參數(shù)db_block_lru_latches

LRU鎖的數(shù)量是在Oracle數(shù)據(jù)庫內(nèi)部用來管理數(shù)據(jù)庫緩沖的,這嚴(yán)重依賴于服務(wù)器上CPU的數(shù)量。

很多聰明的Oracle9i的DBA使用多沖數(shù)據(jù)緩沖(例如db_32k_cache_size),他們推薦將這個(gè)未公開聲明的參數(shù)重設(shè)置為默認(rèn)的最大值。db_block_lru_latches參數(shù)在Oracle8i中使用得很多,但是在Oracle9i中變成了一個(gè)未公開聲明的參數(shù),因?yàn)镺racle現(xiàn)在根據(jù)數(shù)據(jù)庫擁有的CPU數(shù)量設(shè)置了一個(gè)合理的默認(rèn)值。

db_block_lru_latches默認(rèn)被設(shè)置為服務(wù)器上cpu_count的一半(例如服務(wù)器上只有一個(gè)Oracle數(shù)據(jù)庫)。Oracle推薦db_block_lru_latches千萬不要超過cpu_count的兩倍或三倍,或db_block_buffers的五十分之一。

如果使用多緩沖池則這種計(jì)算方法有一個(gè)問題,因?yàn)椴荒芸刂品峙浣o每個(gè)數(shù)據(jù)緩沖池的鎖的數(shù)量。如果db_writers參數(shù)大于1,則默認(rèn)值或許顯得太小。

加強(qiáng)服務(wù)器

Oracle數(shù)據(jù)庫總是在提升性能,根據(jù)外部服務(wù)器環(huán)境檢測cpu_count和基本參數(shù)設(shè)置的能力對于Oracle軟件來說是一個(gè)重要的加強(qiáng)。

隨著更多的Oracle系統(tǒng)轉(zhuǎn)移到SMP上來,當(dāng)客戶要采取增強(qiáng)措施并將眾多的數(shù)據(jù)庫轉(zhuǎn)移到擁有32個(gè)或64個(gè)CPU的巨大服務(wù)器上來的時(shí)候,這些參數(shù)顯得愈發(fā)重要。

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

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

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

parallel_instance_group string
說明 : 一個(gè)群集數(shù)據(jù)庫參數(shù), 標(biāo)識用來大量產(chǎn)生并行執(zhí)行從屬的并行例程組。并行操作只對在其 INSTANCE_GROUPS
參數(shù)中指定一個(gè)匹配組的例程大量產(chǎn)生并行執(zhí)行從屬。
值范圍: 一個(gè)代表組名的字符串。
默認(rèn)值 : 由所有當(dāng)前活動(dòng)例程構(gòu)成的組

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

parallel_min_percent integer 0
說明: 指定并行執(zhí)行要求的線程的最小百分比。設(shè)置該參數(shù), 可以確保并行執(zhí)行在沒有可用的恰當(dāng)查詢從屬進(jìn)程時(shí), 會(huì)顯示一個(gè)錯(cuò)誤消息,
并且該查詢會(huì)因此而不予執(zhí)行。
值范圍: 0 -100
默認(rèn)值: 0, 表示不使用該參數(shù)。

parallel_min_servers integer 0
說明: 指定為并行執(zhí)行啟動(dòng)例程后, Oracle 創(chuàng)建的查詢服務(wù)器進(jìn)程的最小數(shù)量。
值范圍: 0 - PARALLEL_MAX_SERVERS。
默認(rèn)值: 0

parallel_server boolean TRUE
說明 : 將 PARALLEL_SERVER 設(shè)置為 TRUE, 可以啟用群集數(shù)據(jù)庫選項(xiàng)。
值范圍: TRUE | FALSE
默認(rèn)值 : FALSE

parallel_server_instances integer 2
說明: 當(dāng)前已配置的例程的數(shù)量。它用于確定 SGA 結(jié)構(gòu)的大小, 該結(jié)構(gòu)由已配置的例程數(shù)量來確定。正確設(shè)置該參數(shù)將改善 SGA
的內(nèi)存使用情況。 有幾個(gè)參數(shù)是用該數(shù)量計(jì)算得到的。
值范圍: 任何非零值。
默認(rèn)值: 1

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

舉例:Parallel Execution for a Session
并行執(zhí)行會(huì)話,有時(shí)候?yàn)榱思涌靾?zhí)行速度,充分利用多CPU資源,進(jìn)行比如并行創(chuàng)建索引的操作.
要使用并行執(zhí)行某些操作可以使用alter session 語句
ALTER SESSION ENABLE PARALLEL DML|DDL|QUERY
關(guān)閉用如下語句
alter session disable parallel DDL|DML|QUERY
強(qiáng)制并行執(zhí)行:
ALTER SESSION FORCE PARALLEL DML|DDL|QUERY

PARALLEL_MAX_SERVERS參數(shù)用于設(shè)置系統(tǒng)中允許的最大并行進(jìn)程數(shù)。Oracle的文檔對于這個(gè)參數(shù)的描述如下:

PARALLEL_MAX_SERVERS specifies the maximum number of parallel execution processes and parallel recovery processes for an instance. As demand increases, Oracle increases the number of processes from the number created at instance startup up to this value.

If you set this parameter too low, some queries may not have a parallel execution process available to them during query processing. If you set it too high, memory resource shortages may occur during peak periods, which can degrade performance.
這個(gè)參數(shù)在9i及更老的版本中是靜態(tài)參數(shù),修改需要重啟。10g以后可以動(dòng)態(tài)修改生效。如果是RAC環(huán)境,則各節(jié)點(diǎn)應(yīng)當(dāng)設(shè)置成同樣的值。

對于9i
1.如果PARALLEL_AUTOMATIC_TUNING=FALSE
PARALLEL_MAX_SERVERS=5
2.如果PARALLEL_AUTOMATIC_TUNING=TRUE
PARALLEL_MAX_SERVERS=CPU_COUNT x 10

9i中PARALLEL_AUTOMATIC_TUNING默認(rèn)為FALSE,所以PARALLEL_MAX_SERVERS默認(rèn)為5

對于10g
1.如果PGA_AGGREGATE_TARGET >0
PARALLEL_MAX_SERVERS=CPU_COUNT x PARALLEL_THREADS_PER_CPU x 10
2.如果PGA_AGGREGATE_TARGET=0
PARALLEL_MAX_SERVERS=CPU_COUNT x PARALLEL_THREADS_PER_CPU x 5

假如一臺機(jī)器有50顆CPU,安裝的是Oracle9i,則PARALLEL_MAX_SERVERS默認(rèn)值為5,升級到Oracle10g以后,則PARALLEL_MAX_SERVERS默認(rèn)值會(huì)變?yōu)?000,這是值得注意的變化,通常需要根據(jù)需要來重新設(shè)置該參數(shù)。

對于OLTP庫,不宜設(shè)置過大的PARALLEL_MAX_SERVERS,因?yàn)椴⑿胁僮髟贠LTP中可用的場景不多,一般也就是在創(chuàng)建和調(diào)整索引的時(shí)候會(huì)用到,并行掃描使用direct path read,會(huì)導(dǎo)致掃描對象的segment checkpoint,如果當(dāng)時(shí)系統(tǒng)非常繁忙,后果可能非常嚴(yá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)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI