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