oracle插入未调用并行,oracle并行之概念篇
概念 串行執(zhí)行: 串行執(zhí)行時(shí)候,sql語句由一個(gè)server process處理(既只運(yùn)行在一個(gè)cpu上),所以sql語句所能使用的資源受cpu限制,除去異步i/o外server process 處理cpu操作時(shí),不可訪問disk。 并行處理: 就是多個(gè)slave process一起處理同一個(gè)sql語句,server pr
概念
串行執(zhí)行:串行執(zhí)行時(shí)候,sql語句由一個(gè)server process處理(既只運(yùn)行在一個(gè)cpu上),所以sql語句所能使用的資源受cpu限制,除去異步i/o外server process
處理cpu操作時(shí),不可訪問disk。
并行處理:就是多個(gè)slave process一起處理同一個(gè)sql語句,server process充當(dāng)query coordinator(創(chuàng)建slave process,分配任務(wù),收集合并slave process傳的結(jié)果返回給client)。
并行執(zhí)行工作粒度:
1.分區(qū)粒度(paratition granule):一個(gè)分區(qū) 或一個(gè)子分區(qū) 為一個(gè)工作內(nèi)容被分配(分區(qū)segment上)。就是操作PX BLOCK ITERATOR。2.塊范圍粒度(block range granule):segment上一個(gè)范圍內(nèi)的block,運(yùn)行時(shí)動(dòng)態(tài)定義(不是parse時(shí))。就是操作PX PARTION ITERATOR。
注釋:
*oracle傾向于block range granule,因?yàn)閎lock range granule可以讓slave process們得到的工作量比較平均,而分區(qū)粒度 有可能會(huì)使有的slave process得到的分區(qū)的工作量很大,導(dǎo)致時(shí)間響應(yīng)更長(zhǎng)會(huì)影響到并行執(zhí)行的總效率。
*sql語句執(zhí)行2個(gè)或2個(gè)以上獨(dú)立的操作(比如,非相關(guān)性操作join,scan(如全表掃描等)&order by這樣會(huì)使用2組slave process,一組scan,一組order by)
*按scan&order by這個(gè)例 子,2組slave process,第一組select,那么select中的并行(slave process 操作)叫操作內(nèi)并行,即單個(gè)操作內(nèi)并行化。那么scan與order by就是2次操作內(nèi)并行。
*2組slave process用來執(zhí)行一個(gè)sql語句 叫操作間并行(組1 sacn ,組2 orderby 之間操作就是操作間并行)。
*操作間并行時(shí),會(huì)有多組slave process通信,例如組1scan數(shù)據(jù) 給組2orderby,組1就是生產(chǎn)者(producer),組2就是消費(fèi)者(consumer),按生產(chǎn)者與消費(fèi)者執(zhí)行的。
不同操作,就會(huì)選擇不同的分配(數(shù)據(jù))記錄方式給另一個(gè)操作:
1.廣播:每個(gè)生產(chǎn)者發(fā)送所有數(shù)據(jù)給消費(fèi)者
2.range:生產(chǎn)者將執(zhí)定范圍的記錄發(fā)給不同的消費(fèi)者,會(huì)應(yīng)用動(dòng)態(tài)范圍分區(qū)決定哪條記錄給哪個(gè)消費(fèi)者(對(duì)于orde by操作根據(jù)order by子句中字段range分區(qū))
3.loop:記錄會(huì)被平均分給每個(gè)消費(fèi)者(即生產(chǎn)者每loop循環(huán)一次,就給一個(gè)消費(fèi)者發(fā)一條記錄)
4.hash:生產(chǎn)者用hash函數(shù)發(fā)送數(shù)據(jù)給消費(fèi)者,動(dòng)態(tài)應(yīng)用hash分區(qū)來決定哪條記錄給哪個(gè)消費(fèi)者(對(duì)于group by根據(jù)group by子句使用的字段進(jìn)行hash )
5.qc隨機(jī):每個(gè)生產(chǎn)者將所有記錄發(fā)給query coordinator(隨機(jī)),這是常用方法
6.qc順序:每個(gè)生產(chǎn)者將所有記錄發(fā)給query coordinator(順序很重要),并行orderby用這個(gè)給query coordinator(server process)發(fā)送數(shù)據(jù)
#上面的廣播方法就是執(zhí)行計(jì)劃中 px send qc(random/order)操作或是px send(qc 隨機(jī))操作 , 其父操作就是px coordator(查詢調(diào)度)。
上面的range/hash/loop就是執(zhí)行計(jì)劃中px send qc
range/hash/loop 操作 ,其父操作就是px recive(接收者,消費(fèi)者)。
并行操作間關(guān)系(執(zhí)行計(jì)劃中in-out部分)
p-s:并行發(fā)送數(shù)據(jù)給串行
p-p:(有2組slaves process時(shí)使用),一個(gè)并行操作將數(shù)據(jù)發(fā)送給另一個(gè)并行操作
pcwp:相同slave process并行執(zhí)行一個(gè)操作及其父操作,無通訊
pcwc:相同slave process并行執(zhí)行一個(gè)操作及其子操作,無通訊
s-p:串行發(fā)送數(shù)據(jù)給并行,效率差(1.單一進(jìn)程產(chǎn)生數(shù)據(jù)沒有多個(gè)進(jìn)程消費(fèi)數(shù)據(jù)快,消費(fèi)者花很多時(shí)間等數(shù)據(jù)而不是處理數(shù)據(jù);2.串行執(zhí)行操作和并行執(zhí)行操作發(fā)送數(shù)據(jù)有一些不必要的通訊)
參數(shù)控制并行:
1.parallel_min_servers:
instance 啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例時(shí)就會(huì)自動(dòng)創(chuàng)建的slaves process數(shù)量,這樣當(dāng)server process請(qǐng)求時(shí)候就不需要重新創(chuàng)建了,直接使用就可以。當(dāng)server process請(qǐng)求的數(shù)量超過這個(gè)設(shè)置值時(shí),就會(huì)創(chuàng)建新的slave process,新創(chuàng)建的在使用完成后會(huì)在slave process pool(oracle會(huì)管理一個(gè)slave process pool,query coordinator process既server
process從這個(gè)pool中請(qǐng)求slave process,sql語句開始使用,使用后slave process返回pool)。
保存5分鐘若還未人使用 就釋放,所以 參數(shù)parallel_min_servers控制這個(gè)pool中啟始slave process數(shù)量,defalut 0,表示需要時(shí)候才創(chuàng)建。
什么時(shí)候需要修改該參數(shù):一般在出現(xiàn)os thread startup 這個(gè)event(表示sql語句花時(shí)間等待slave process)才修改這個(gè)值。
2.parallel_max_server:
控制pool中slave process最大數(shù)量(可以設(shè)置成cpu_count ,8-10倍)。
若parallel_adaptive_multi_user(為boolean 類型的參數(shù))為TRUE (10G default為TRUE)時(shí),僅允許有限數(shù)目的用戶按默認(rèn)的并行程度運(yùn)行。
這個(gè)限度由_parallel_adaptive_max_users控制。 _parallel_adaptive_max_users表示maximum number of users running with default DOP。例如,_parallel_adaptive_max_users為 2,即 指定 現(xiàn)在顯示為2個(gè)USER。
#查看server process pool狀態(tài)
SQL> select * from v$px_process_sysstat where upper(statistic) like ‘SERVER%’;
STATISTIC VALUE
—————————— ———-
Servers In Use 0~~使用的
Servers Available 2~~
Servers Started 2~~~啟動(dòng)過幾個(gè)
Servers Shutdown 0
Servers Highwater 2~~~最高到達(dá)
Servers Cleaned Up 0
Server Sessions 2
7 rows selected.
*sga中有一個(gè)table queue內(nèi)存給消費(fèi)者發(fā)送數(shù)據(jù),每對(duì)(生產(chǎn)者&消費(fèi)者)對(duì)應(yīng)一個(gè)table queue處理2組從屬進(jìn)程間通信,table queue 可以放在shared pool,也可以large pool
(其實(shí)table queue就是 px msg pool),當(dāng)10G SGA_TARGET>0 or 11g memory_target>0時(shí) 都是存在large pool,parallel_automatic_tuning=true放在large pool,10G 默認(rèn)為TRUE,11g
默認(rèn)就是放在large pool,parallel_automatic_tuning在11G已經(jīng)廢棄向后兼容保留了(The PARALLEL_AUTOMATIC_TUNING parameter is deprecated. It is retained for backward compatibility only.)
關(guān)于這個(gè)parallel_automatic_tuning更詳細(xì)的說明
When PARALLEL_AUTOMATIC_TUNING is set to true, Oracle determines the default values for parameters that control parallel execution. In addition to setting this parameter, you must specify the PARALLEL clause for the target tables in the system. Oracle then
tunes all subsequent parallel operations automatically.
If you used parallel execution in a previous release and are now enabling PARALLEL_AUTOMATIC_TUNING, then you should reduce the amount of memory allocated from the shared pool to account for the decreased demand on that pool. This memory will now be allocated
from the large pool, and will be computed automatically if LARGE_POOL_SIZE is not specified.
As part of the automatic tuning, Oracle will enable the PARALLEL_ADAPTIVE_MULTI_USER parameter. You can override any of the system-provided defaults if desired.
每個(gè)table queue由3個(gè)buffer (塊)組成,在rac里為4個(gè)。每個(gè)buffer大小由parallel_execution_message_size控制,默認(rèn)為2152bytes,parallel_automatic_tuning=true,parallel_execution_message_size=4096 bytes。
可以設(shè)置大點(diǎn)16k,32k,64K(內(nèi)存要足夠)
#########large pool size
large_pool_size>=parallel_max_servers^2.parallel_execution_message_size.3(rac .4)
SQL> select * from v$sgastat where upper(name)=’PX MSG POOL’;
POOL NAME BYTES
———— ————————– ———-
large pool PX msg pool 902160
所以可以認(rèn)為table queue就是px msg pool
SQL> select pool,name ,bytes/1024/1024/1024 from v$sgastat where upper(pool) like ‘%LARGE%’;
POOL NAME BYTES/1024/1024/1024
———— ————————– ——————–
large pool PX msg pool .000840202
large pool free memory .003066048 本條技術(shù)文章來源于互聯(lián)網(wǎng),如果無意侵犯您的權(quán)益請(qǐng)點(diǎn)擊此處反饋版權(quán)投訴 本文系統(tǒng)來源:php中文網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的oracle插入未调用并行,oracle并行之概念篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一般项目中哪里体现了数据结构_优秀程序员
- 下一篇: requests 返回的cookies为