Shared Pool 的基本原理

edwardking888發表於2010-04-13

Shared Pool是Oracle SGA設定中最複雜也是最重要的一部分內容,Oracle通過Shared Pool來實現SQL共享、減少程式碼硬解析等,從而提高資料庫的效能。在某些版本中,如果設定不當,Shared Pool可能會極大影響資料庫的正常執行。

在Oracle 7 之前,Shared Pool並不存在,每個Oracle連線都有一個獨立的Server程式與之相關聯,Server程式負責解析和優化SQL和PL/SQL程式碼。典型的,在OLTP環境中,很多程式碼具有相同或類似的結構,反覆的獨立解析浪費了大量的時間以及資源,Oracle最終認識到這個問題,並且從PL/SQL開始嘗試把這部分可共享的內容進行獨立儲存和管理,於是Shared Pool作為一個獨立的SGA元件開始被進入,並且其功能和作用被逐漸完善和發展起來。

在這裡注意到,Shared Pool最初被引入的目的,也就是它的本質功能在於實現共享。如果使用者的系統程式碼是完全異構的(假設程式碼從不繫結變數,從不反覆執行),那麼就會發現,這時候Shared Pool完全就成了一個負擔,它在徒勞無功地進行無謂的努力:儲存程式碼、執行計劃等待重用,並且客戶端要不停的獲取Latch,試圖尋找共享程式碼,卻始終一無所獲。如果真的如此,那這是我們最不願看到的情況,Shared Pool變得有害無益。當然這是極端的,可是在效能優化中我們發現,大多數效能低下的系統都存在這樣的通病:程式碼極少共享,缺乏或從不實行變數繫結。優化這些系統的根本方法就是優化程式碼,使程式碼(在保證效能的前提下)可以充分共享,減少無謂的反覆硬/軟解析

實際上,Oracle引入Shared Pool就是為了幫助我們實現程式碼的共享和重用。瞭解了這一點之後,我們在應用開發的過程中,也應該有意識地提高自己的程式碼水平,以期減少資料庫的壓力。這應該是對開發人員最基本的要求。

Shared Pool主要由兩部分組成,一部分是庫快取(Library Cache)另一部分是資料字典快取(Data Dictionary Cache)Library Cache主要用於儲存SQL語句、SQL語句相關的解析樹、執行計劃、PL/SQL程式塊(包括匿名程式塊、儲存過程、包、函式等)以及它們轉換後能夠被Oracle執行的程式碼等,這部分資訊可以通過v$librarycache檢視查詢至於Data Dictionary Cache主要用於存放資料字典資訊,包括表、檢視等物件的結構資訊,使用者以及物件許可權資訊,這部分資訊相對穩定,在Shared Pool中通過字典快取單獨存放,字典快取的內容是按行(Row)儲存的(其他資料通常按Buffer儲存),所以又被稱為Row Cache,其資訊可以通過v$rowcache查詢

除了以上兩個部分外,從Oracle Database 11g開始,在Shared Pool中劃分了另外一塊記憶體用於儲存SQL查詢的結果集,稱為Result Cache Memory。以前Shared Pool的主要功能是共享SQL,減少硬解析,從而提高效能,但是SQL共享之後,執行同樣可能消耗大量的時間和資源,現在Oracle嘗試將查詢的結果集快取起來,如果同一SQL或PL/SQL函式多次執行(特別是包含複雜運算的SQL),那麼快取的查詢結果可以直接返回給使用者,不需要真正去執行運算,這樣就又為效能帶來了極大的提升。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-659602/,如需轉載,請註明出處,否則將追究法律責任。

相關文章