oracle并行parallel update两张表_Oracle与并行性 parallel
Oracle與并行性
并行化操作能力是巨型數(shù)據(jù)庫(Very
Large
Database,簡稱VLDB)最重要的特性之一。帶有多個(gè)CPU的數(shù)據(jù)庫服務(wù)器,也被稱作SMP,目前是大多數(shù)數(shù)據(jù)庫服務(wù)器的標(biāo)準(zhǔn)配置。當(dāng)性能需求以
及數(shù)據(jù)量不斷的增長,更加需要使用多處理器和多磁盤來減少完成給定任務(wù)所需的時(shí)間。通過運(yùn)行實(shí)時(shí)應(yīng)用集群,Oracle即可支持單SMP服務(wù)器中的并行,
還可以支持多個(gè)節(jié)點(diǎn)間的并行。以并行方式執(zhí)行一個(gè)SQL語句將消耗更多的機(jī)器資源——CPU,內(nèi)存和磁盤I/O——但是可以縮短整個(gè)任務(wù)的完成時(shí)間。
并行操作以一種比較線性的方式影響著執(zhí)行一個(gè)給定任務(wù)所需要的內(nèi)存數(shù)量和CPU資源。每個(gè)并行執(zhí)行進(jìn)程都有一個(gè)PGA(Program
Global Area,程序全局區(qū)),它需要占用一定的內(nèi)存來完成工作。每個(gè)并行執(zhí)行進(jìn)程會(huì)占用自己的CPU時(shí)間片,但是很多并行進(jìn)程都可以減少磁盤I/O的時(shí)間,磁盤I/O往往是瓶頸最容易產(chǎn)生的地方。
Oracle數(shù)據(jù)庫中存在兩種可能的并行類型:
塊-范圍(block-range)并行
有數(shù)據(jù)庫塊的范圍驅(qū)動(dòng)。
基于分區(qū)的并行
由操作中涉及的一定數(shù)量的分區(qū)或子分區(qū)驅(qū)動(dòng)。
下面幾節(jié)將描述這兩種類型的并行。
塊-范圍并行
1994年,Oracle
7.1引入了動(dòng)態(tài)并行化表掃描和各種基于掃描的函數(shù)的能力。這種類型的并行是基于塊范圍(block-range)的概念,Oracle服務(wù)器將了解每個(gè)
表中包含了一組數(shù)據(jù)塊,而每個(gè)數(shù)據(jù)塊涵蓋了一個(gè)指定范圍的數(shù)據(jù)。Oracle
7通過動(dòng)態(tài)的把一個(gè)表分解成幾塊來實(shí)現(xiàn)塊-范圍并行,分解得到每一個(gè)塊就是一個(gè)數(shù)據(jù)塊的范圍,然后以并行的方式用多進(jìn)程來處理這些分解的塊。Oracle
的塊-范圍并行的實(shí)現(xiàn)是獨(dú)一無二的,因?yàn)樗灰髮?duì)表進(jìn)行物理分區(qū)。
有了這種類型的并行,發(fā)出SQL語句的客戶會(huì)話將透
明地成為并行執(zhí)行協(xié)調(diào)器,它將動(dòng)態(tài)的確定塊范圍并把它們分配給一組并行執(zhí)行(PE)進(jìn)程。一旦PE進(jìn)程完成了一個(gè)分配的塊范圍,它就返回給協(xié)調(diào)器以便請(qǐng)求
下一步的工作。不是所有的I/O都以相同的速率發(fā)生,因此一些PE進(jìn)程可能比另一些PE進(jìn)程處理更多的數(shù)據(jù)塊。“stealing
work”的概念允許所有的進(jìn)程充分參與各項(xiàng)任務(wù),從而最大限度的利用主機(jī)資源。
如果有足夠的硬件資源,那么塊-范圍并行的規(guī)模與
PE進(jìn)程的數(shù)量成線性關(guān)系。實(shí)現(xiàn)并行的伸縮性關(guān)鍵在于硬件基礎(chǔ)。每個(gè)PE進(jìn)程均運(yùn)行在一個(gè)CPU上,并且只對(duì)一個(gè)設(shè)備請(qǐng)求I/O。如果有足夠的CPU去讀
取足夠的磁盤,并行將成比例擴(kuò)展。如果系統(tǒng)在這些資源中的某一點(diǎn)遇到一個(gè)瓶頸,伸縮性則會(huì)受到影響。例如,有4個(gè)CPU,但是只讀取2個(gè)磁盤,那么并不會(huì)
是磁盤的雙路伸縮性成倍增長;如果額外的CPU會(huì)導(dǎo)致磁盤競爭,那么還會(huì)帶來并行能力的下降。同樣的,2個(gè)CPU讀取20個(gè)磁盤也不會(huì)成比例的將性能提高
20倍。系統(tǒng)硬件必須在并行的同時(shí)依照比例關(guān)系進(jìn)行平衡。
大多數(shù)的大型系統(tǒng)中,磁盤數(shù)量要遠(yuǎn)遠(yuǎn)大于CPU的數(shù)量。在這些系統(tǒng)中,并行導(dǎo)致了I/O和I/O子系統(tǒng)的隨機(jī)化。這對(duì)于不同用戶的PE進(jìn)程在不同時(shí)間讀取不同磁盤的并行數(shù)據(jù)方式是很有用的,因?yàn)樗沟肐/O分布在多個(gè)可用的磁盤上。
打個(gè)比方,動(dòng)態(tài)的并行性猶如吃餡餅。這個(gè)餡餅就像是
該操作要讀取的一組數(shù)據(jù)塊,并且目的是盡可能塊的讓一定數(shù)量的人吃掉這個(gè)餡餅。Oracle按份來提供這個(gè)餡餅,當(dāng)其中一個(gè)人吃完它的第一份時(shí),他可以再
回去要跟多份。并不是每個(gè)人都以相同的速度吃餡餅,因此某些人將會(huì)比其他一些人吃得多。這種方法在現(xiàn)實(shí)世界中稍微顯得有些不公平,但對(duì)于并行來說它是一種
很好的模式,因?yàn)槿绻總€(gè)人自始自終一直在吃,這個(gè)餡餅將會(huì)以更快的速度被吃掉。另一種選擇就是給每個(gè)人相同份數(shù)的餡餅,并一直等著吃得最慢的人吃完它的
那份。
圖7-5顯示了將一組數(shù)據(jù)塊分割成幾個(gè)數(shù)據(jù)區(qū)間。
圖7-5 動(dòng)態(tài)的塊-范圍并行化
表的范圍與表的分區(qū)
在Oracle
8中引入了分區(qū)表,一個(gè)操作可能會(huì)涉及到一個(gè)分區(qū)表中的一個(gè),多個(gè)或所有的分區(qū)。對(duì)于一個(gè)常規(guī)的表而言,塊-范圍并行機(jī)制將動(dòng)態(tài)地分割一組數(shù)據(jù)塊以便讀
取,這一點(diǎn)與分區(qū)表并沒有本質(zhì)的區(qū)別。一旦優(yōu)化器確定了操作該訪問哪一個(gè)分區(qū),所有涉及到的分區(qū)的數(shù)據(jù)塊則都被看做是一個(gè)分割成多個(gè)數(shù)據(jù)區(qū)間的池。
優(yōu)化器的這種假設(shè)導(dǎo)致了使用并行和分區(qū)表的一個(gè)關(guān)鍵
問題。并行度(即用于整個(gè)表的并行執(zhí)行進(jìn)程的數(shù)目)需要應(yīng)用到某一項(xiàng)操作所用的一組分區(qū)上。如果分區(qū)中沒有包含操作要用的數(shù)據(jù),那么優(yōu)化器就會(huì)排除這一分
區(qū)。例如,如果一個(gè)表的某個(gè)分區(qū)包含的ID號(hào)在1000以下,而若要查詢請(qǐng)求ID號(hào)在1100和5000之間,優(yōu)化器就會(huì)知道這項(xiàng)查詢不可能訪問這個(gè)分
區(qū)。
從Oracle 9i開始,你也可以基于一組特定的值來對(duì)表進(jìn)行分區(qū),不過這種類型的分區(qū)通常適合于維護(hù)操作的分區(qū)表。正如第4章講述的那樣,Oracle一直在添加更多的實(shí)施分區(qū)的方法。
如果你期望你的查詢使用分區(qū)排除或修剪而且計(jì)劃采用
并行性,那么你應(yīng)該在足夠多的驅(qū)動(dòng)器上條帶化每個(gè)分區(qū)從而使之能夠有效的擴(kuò)展。這種做法不論訪問分區(qū)的數(shù)目大小都可以確保可擴(kuò)展性。條帶化的工作可以通過
在多個(gè)磁盤上保存多個(gè)數(shù)據(jù)文件的方法手工完成。這些磁盤可以以條帶化的形式組成陣列,也可以結(jié)合這兩種方法組成陣列。
什么可以實(shí)現(xiàn)并行化?
Oracle不僅僅能夠?qū)唵蔚牟樵冞M(jìn)行并行化,而且還能夠?qū)υS多操作執(zhí)行塊-范圍并行化,具體包括:
*表空間的創(chuàng)建
*索引的創(chuàng)建與重建
*在線索引的重組與重建
*根據(jù)索引組織的表的重組與重建
*表的創(chuàng)建,例如使用CREATE TABLE …AS SELECT
*分區(qū)維護(hù)操作,例如遷移與分割分區(qū)
*數(shù)據(jù)加載
*完整性約束的實(shí)施
*統(tǒng)計(jì)的收集(從Oracle數(shù)據(jù)庫10g開始可自動(dòng)收集)
*備份與恢復(fù)(在Oracle數(shù)據(jù)庫11g中包含大型文件)
*DML操作(INSERT,UPDATE,DELETE)
*查詢處理操作
*OLAP集合(就Oracle數(shù)據(jù)庫10g而言)
Oracle還能夠?yàn)楦鱾€(gè)查詢處理步驟提供并行化的優(yōu)勢。可能實(shí)現(xiàn)并行化的查詢處理特性包括:
*表掃描
*嵌套循環(huán)
*排序合并關(guān)聯(lián)
*哈希關(guān)聯(lián)
*位圖星型關(guān)聯(lián)
*索引掃描
*面向分區(qū)的關(guān)聯(lián)
*反關(guān)聯(lián)(NOT IN)
*SELECT DISTINCT
*UNION和UNION ALL
*ORDER BY
*GROUP BY
*聚集
*導(dǎo)入
*用戶自定義函數(shù)
并行度
Oracle實(shí)例有一個(gè)對(duì)于數(shù)據(jù)庫用戶可用的PE進(jìn)程池。這些進(jìn)程會(huì)消耗CPU,內(nèi)存和I/O資源。控制活躍PE進(jìn)程的最大數(shù)量是很重要的;因?yàn)樘嗟腜E進(jìn)程將會(huì)給主機(jī)帶來過重的負(fù)擔(dān),導(dǎo)致出現(xiàn)資源瓶頸和性能的退化。高度的并行性還會(huì)導(dǎo)致全表掃描,這種情況可能可能好
,也可能壞。圖7-6顯示了PE進(jìn)程組內(nèi)和組間的透明并行性。
圖7-6 操作內(nèi)和操作間的并發(fā)性
在有多個(gè)用戶并且工作負(fù)荷不斷變化的情況下,確定最
佳的并發(fā)度具有一定的挑戰(zhàn)性。例如,當(dāng)查詢并發(fā)度為8的時(shí)候,就能夠滿足1到2個(gè)用戶查詢操作對(duì)性能的需求,但是如果有20個(gè)用戶查詢同一個(gè)表,又會(huì)怎么
樣?這個(gè)時(shí)候可能需要160個(gè)PE進(jìn)程(8個(gè)PE進(jìn)程服務(wù)20個(gè)用戶),這么多的PE進(jìn)程可能會(huì)讓機(jī)器超載。
將并行度設(shè)置為為最小的公共分母值(例如,2),在用戶數(shù)較多的時(shí)候,能夠提供有效的并行性,但是當(dāng)用戶較少的時(shí)候,并不能充分利用資源。
自調(diào)整適應(yīng)性并行
Oracle
8i引入了自調(diào)整適應(yīng)性并行(self-tuning adaptive
parallelism)的概念。當(dāng)系統(tǒng)負(fù)責(zé)增加時(shí),這個(gè)特性將自動(dòng)的按比例減小并行度;當(dāng)系統(tǒng)負(fù)載減少時(shí),則會(huì)自動(dòng)的成比例增大并行度。當(dāng)某個(gè)操作要求
具有一定的并行度的時(shí)候,Oracle會(huì)檢查系統(tǒng)的負(fù)載并降低實(shí)際操作并行度以避免系統(tǒng)負(fù)載過重。要求并行操作的用戶越多,他們接受到的并行度就會(huì)越來越
低,直到操作連續(xù)的執(zhí)行完畢。如果操作減少,隨后的操作將賦予不斷增大的并行度。這種適應(yīng)性可以把DBA從本來不可能做到的任務(wù)中解放出來,這個(gè)不可能的
任務(wù)就是在面對(duì)并發(fā)性和工作負(fù)載不斷變化的條件下確定最佳的并行度。
在確定賦予一項(xiàng)操作的并行度的過程中,自適應(yīng)并行要考慮兩個(gè)因素:
*系統(tǒng)負(fù)荷
*在數(shù)據(jù)庫資源管理器活躍的條件下,用戶客戶群體的并行資源限制。(第9章以及本章的后面將會(huì)講述數(shù)據(jù)庫資源管理器)這一點(diǎn)非常重要,因?yàn)檫@意味著如果存在自適應(yīng)并行,就還需要考慮資源的規(guī)劃。
基于分區(qū)的并行性
對(duì)于需要實(shí)現(xiàn)并行的語句,Oracle并行功能的小
子集則基于該語句所訪問的分區(qū)或子分區(qū)的數(shù)據(jù)。對(duì)于塊-范圍并行,每個(gè)PE進(jìn)程工作所需的數(shù)據(jù)片為數(shù)據(jù)塊的范圍;對(duì)于基于分區(qū)的并行,驅(qū)動(dòng)并行的數(shù)據(jù)片是
指一個(gè)表的分區(qū)或子分區(qū)。需要根據(jù)分區(qū)或者子分區(qū)的數(shù)目來進(jìn)行并行化的操作有:
*更新和刪除操作
*索引掃描操作
*分區(qū)表上的索引創(chuàng)建和重建
表分區(qū)和子分區(qū)的并行
Oracle 8引入了對(duì)并行DML(數(shù)據(jù)操作語言)的支持,即支持并行的執(zhí)行INSERT,UPDATE,和DELETE語句。這種類型的并行改進(jìn)大量數(shù)據(jù)操作(例如,更新一個(gè)大型表中所有行的操作)的性能。
在Oracle
8中更新和刪除操作的并行度與涉及到的分區(qū)數(shù)量是密切相關(guān)的;而對(duì)于Oracle
8i及以后版本,更新和刪除操作的并行度則與涉及到的分區(qū)或子分區(qū)的是數(shù)量有關(guān)。一個(gè)有12個(gè)分區(qū)的表(例如,每個(gè)分區(qū)對(duì)應(yīng)一年中的每個(gè)月)對(duì)于并行更新
和刪除操作可以擁有最大為12的并行度。僅對(duì)一個(gè)月的數(shù)據(jù)進(jìn)行更新操作不會(huì)并行,因?yàn)樗簧婕暗揭粋€(gè)分區(qū)。如果通過使用Oracle的復(fù)合分區(qū)(例如,每
個(gè)月分區(qū)中根據(jù)PRODUCT_ID再分為4個(gè)哈希子分區(qū))創(chuàng)建一個(gè)表,對(duì)于整個(gè)表最大的并行度將是48,即有12個(gè)分區(qū),每個(gè)分區(qū)又有4個(gè)子分區(qū)。因此
對(duì)于一個(gè)月數(shù)據(jù)的更新操作并行度可以為4,因?yàn)槊總€(gè)月包含4個(gè)哈希子分區(qū)。如果這個(gè)表沒有被分區(qū),Oracle就不能以并行的方式執(zhí)行更新操作。
在Oracle 8以及之后的版本中,可以使用類似于并行DML的語義,即每個(gè)索引分區(qū)或子分區(qū)對(duì)應(yīng)一個(gè)PE進(jìn)程,同時(shí)以并行的方式對(duì)分區(qū)的索引執(zhí)行創(chuàng)建,重建,和掃描操作。
對(duì)未分區(qū)的表進(jìn)行快速完全索引掃描
人們常常會(huì)認(rèn)為只有對(duì)目標(biāo)索引進(jìn)行分區(qū)之后
Oracle數(shù)據(jù)庫才能并行處理索引掃描。Oracle
7.3引入了在某些場合下對(duì)未分區(qū)的表進(jìn)行快速完全索引掃描的功能。如果索引掃描操作是“不受約束的”,即對(duì)整個(gè)索引的訪問為了滿足查詢的需求,那么
Oracle
7.3及更高的版本將使用塊-范圍并行機(jī)制,從而并行化對(duì)整個(gè)索引的訪問。因此,當(dāng)Oracle可以對(duì)未分區(qū)的表進(jìn)行快速完全索引掃描時(shí),這個(gè)特性適用于
范圍有限的查詢。基于分區(qū)的索引掃描則適用于更大范圍的查詢操作。
未分區(qū)表和分區(qū)表的并行插入操作
Oracle可以通過INSERT INTO
tableX SELECT …FROM
tableY這樣的語句以并行的方式對(duì)未分區(qū)表和分區(qū)表執(zhí)行一條插入語句。Oracle用一組PE進(jìn)程對(duì)插入語句中SELECT部分執(zhí)行塊-范圍并行化。
這些PE進(jìn)程把多行數(shù)據(jù)傳遞到第二組PE進(jìn)程,第二組PE進(jìn)程再把這些數(shù)據(jù)插入到目標(biāo)表中。目標(biāo)表可以是未分區(qū)表,也可以是分區(qū)表。因此,插入操作的并行
不是嚴(yán)格意義下的塊-范圍并行或基于分區(qū)的并行。
總結(jié)
以上是生活随笔為你收集整理的oracle并行parallel update两张表_Oracle与并行性 parallel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在微型计算机系统中,打印机一般是通过(
- 下一篇: hdc mfc 画扇形图_MFC画图总结