Shared Pool 的基本原理
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Shared Pool】使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared PoolSQL物件
- Oracle shared poolOracle
- _shared_pool_reserved_pct or shared_pool_reserved_size with ASMMASM
- zt_Oracle shared pool internals_共享池_shared_poolOracle
- SHARED POOL總結
- SHARED_POOL解析
- 理解Oracle Shared PoolOracle
- latch:shared pool的一點理解
- Shared Pool 的轉儲與分析
- Oracle Shared Pool Memory ManagementOracle
- ORACLE SGA之shared poolOracle
- 使用DBMS_SHARED_POOL包將PL/SQL大物件儲存到Shared PoolSQL物件
- dbms_shared_pool keep物件到share pool中物件
- shared_pool的sql命中率SQL
- SHARED POOL 基礎知識
- 簡單分析shared pool(一)
- 簡單分析shared pool(二)
- 簡單分析shared pool(三)
- shared_pool_spare_free.sqlSQL
- ORACLE記憶體管理 之五 SGA variable pool,shared_pool,large_pool,java_poolOracle記憶體Java
- shared pool記憶體結構記憶體
- 安裝DBMS_SHARED_POOL包
- oracle優化--shared_pool (3)Oracle優化
- oracle優化--shared_pool (2)Oracle優化
- oracle優化--shared_pool (1)Oracle優化
- PL/SQL Program Units and the Shared Pool (89)SQL
- 基於引數shared_pool_reserved_size進一步理解共享池shared pool原理
- SHARED POOL 空閒空間分配流程
- 轉_診斷latch:shared pool等待事件事件
- 診斷shared pool常用命令
- oracle 9i2 ? shared pool 巨大?Oracle
- Oracle記憶體分配與使用小記(二)Shared Pool and Large PoolOracle記憶體
- shared pool的物理結構和邏輯結構
- Shared pool的library cache lock/pin及硬解析
- 將SYS和SYSTEM的物件都KEEP到shared pool物件
- SQL在shared pool中的解析過程問題SQL
- SHARED POOL ORA-04031錯誤分析
- Shared pool深入分析及效能調整