用Oracle並行查詢發揮多CPU的威力

2021-08-22 04:10:55 字數 2575 閱讀 1797

在乙個單獨的伺服器中安裝更多的cpu成為目前的乙個趨勢。使用對稱多處理伺服器(smp)的情況下,乙個oracle伺服器擁有8個、16個或32個cpu以及幾吉位元ram的sga都不足為奇。

oracle跟上了硬體發展的步伐,提供了很多面向多cpu的功能。從oracle8i開始,oracle在每個資料庫函式中都實現了並行性,包括sql訪問(全表檢索)、並行資料操作和並行恢復。對於oracle專業版的挑戰是為使用者的資料庫配置盡可能多的cpu。

在oracle環境中實現並行性最好的方法之一是使用oracle並行查詢(opq)。我將討論opq是如何工作的和怎樣用它來提公升大的全表檢索的響應時間以及呼叫並行事務回滾等等。

使用opq

當在oracle中進行一次合法的、大型的全表檢索時,opq能夠極大地提高響應時間。通過opq,oracle將表劃分成如a所示的邏輯塊。

圖 a由opq劃分的表

一旦表被劃分成塊,oracle啟用並行的子查詢(有時稱為雜務程序),每個子查詢同時讀取乙個大型表中的一塊。所有子查詢完畢以後,oracle將結果會傳給並行查詢排程器,它會重新安排資料,如果需要則進行排序,並且將結果傳遞給終端使用者。opq具有無限的伸縮性,因此,以前需要花費幾分鐘的全表檢索現在的響應時間卻不到1秒。

opq嚴重依賴於處理器的數量,通過並行執行之所以可以極大地提公升全表檢索的效能,其前提就是使用了n-1個並行程序(n=oracle伺服器上cpu的數量)。

必須注意非常重要的一點,即oracle9i能夠自動檢測外部環境,包括伺服器上cpu的數量。在安裝時,oracle9i會檢查伺服器上cpu的數量,設定乙個名為cpu_count的引數,並使用cpu_count作為預設的初始化輸入引數。這些初始化引數會影響到oracle對內部查詢的處理。

下面就是orale在安裝時根據cpu_count而設定的一些引數:

引數 讓我們進一步看看cpu的數量是如何影響這些引數的。

引數fast_start_parallel_rollback

oracle並行機制中乙個令人興奮之處是在系統崩潰時呼叫並行回滾得能力。當oracle資料庫發生少有的崩潰時,oracle能自動檢測未完成的事務並回滾到起始狀態。這被稱為並行熱啟動,而oracle使用基於cpu_count的fast_start_parallel_rollback引數來決定未完成事務的秉性程度。

並行資料操縱語言(dml)恢復能夠在oracle資料庫崩潰後極大地加快其重新啟動的速度。此引數的預設值是系統cpu數量的兩倍,但是一些dba們認為應該將這個值設定為cpu_count的四倍。

引數parallel_max_servers_parameter

oracle乙個顯著的加強是自動決定opq並行的程度。由於oracle清楚伺服器中cpu的數量,它會自動分配合適的子程序的數量來提公升並行查詢的響應時間。當然,會有其它的外部因素,比如表的劃分以及磁碟輸入/輸出子系統的布局等,但是根據cpu_count來設定parallel_max_servers引數將給oracle乙個合理的依據來選擇並行的程度。

由於oracle的並行操作嚴重依賴伺服器上cpu的數量,parallel_max_servers會被設定成伺服器上cpu的數量。如果在一台伺服器上執行多個例項,則預設值太大了,會導致過度的頁面交換和嚴重的cpu負擔。並行的程度還依賴於目標表中分割槽的數量,因此parallel_max_servers應該設定成足夠大以允許oracle為每個查詢選擇最佳數量的並行子查詢。

引數log_buffer

引數log_buffer定義了供即刻寫入redo日誌資訊的保留ram的數量,這個引數受cpu_count的影響。oracle推薦log_buffer最大為cpu_count乘以500kb或128kb。cpu的數量對於log_buffer來說非常重要,因為oracle會生成多日誌寫入(lgwr)程序來非同步釋放redo資訊。

log_buffer是oracle中最易誤解的的ram引數之一,通常存在下面幾個配置錯誤:

引數db_block_lru_latches

lru鎖的數量是在oracle資料庫內部用來管理資料庫緩衝的,這嚴重依賴於伺服器上cpu的數量。

很多聰明的oracle9i的dba使用多沖資料緩衝(例如db_32k_cache_size),他們推薦將這個未公開宣告的引數重設定為預設的最大值。db_block_lru_latches引數在oracle8i中使用得很多,但是在oracle9i中變成了乙個未公開宣告的引數,因為oracle現在根據資料庫擁有的cpu數量設定了乙個合理的預設值。

db_block_lru_latches預設被設定為伺服器上cpu_count的一半(例如伺服器上只有乙個oracle資料庫)。oracle推薦db_block_lru_latches千萬不要超過cpu_count的兩倍或三倍,或db_block_buffers的五十分之一。

如果使用多緩衝池則這種計算方法有乙個問題,因為不能控制分配給每個資料緩衝池的鎖的數量。如果db_writers引數大於1,則預設值或許顯得太小。

加強伺服器

oracle資料庫總是在提公升效能,根據外部伺服器環境檢測cpu_count和基本引數設定的能力對於oracle軟體來說是乙個重要的加強。

隨著更多的oracle系統轉移到smp上來,當客戶要採取增強措施並將眾多的資料庫轉移到擁有32個或64個cpu的巨大伺服器上來的時候,這些引數顯得愈發重要。

用Oracle並行查詢發揮多CPU的威力

在乙個單獨的伺服器中安裝更多的cpu成為目前的乙個趨勢。使用對稱多處理伺服器 smp 的情況下,乙個oracle伺服器擁有8個 16個或32個cpu以及幾吉位元ram的sga都不足為奇。oracle跟上了硬體發展的步伐,提供了很多面向多cpu的功能。從oracle8i開始,oracle在每個資料庫函...

Oracle 並行查詢

並行查詢允許將乙個sql select語句劃分為多個較小的查詢,每個部分的查詢併發地執行,然後會將各個部分的結果組合起來,提供最終的答案。我們來看乙個例子 1.執行如下一串sql語句,建立乙個叫big table的表,期間會讓你錄入1的值 想要往big table表裡面插入多少行資料 我錄入的是10...

Oracle 並行查詢

所謂並行執行,是指能夠將乙個大型序列任務 任何dml,一般的ddl 物理的劃分為叫多個小的部分,這些較小的部分可以同時得到處理。何時使用並行執行 1 必須有乙個非常大的任務 2 必須有充足的資源 cpu,i o,memory alter table test a parallel 告訴oracel,...