Oracle 數據庫共享池與大池調優指南

????????在 Oracle 數據庫的內存管理中,共享池(Shared Pool)和大池(Large Pool)是 SGA(系統全局區)中負責緩存與資源分配的核心組件。合理配置和調優這兩個池,能顯著提升數據庫性能 —— 尤其是在減少解析開銷、降低鎖競爭、優化內存利用率等方面。本文基于 Oracle 19c 官方文檔,系統梳理共享池與大池的調優思路、關鍵配置及實踐方法。

共享池:核心緩存與解析優化的關鍵

????????共享池是 SGA 中用于緩存 SQL/PLSQL 代碼、數據字典信息、結果集等核心數據的內存區域。其核心價值在于通過重用已解析的代碼和字典數據,減少 CPU 消耗、降低 I/O 操作,并避免頻繁的內存鎖競爭。

一、共享池的核心組件與作用

共享池的性能直接取決于內部組件的高效運作,主要包含以下核心部分:

  • 庫緩存(Library Cache):存儲 SQL/PLSQL 代碼的可執行形式(解析或編譯后)。當執行 SQL 時,若庫緩存中存在可重用的解析結果(軟解析),可避免重新解析(硬解析);反之則需執行硬解析,消耗更多 CPU 和內存資源。
  • 數據字典緩存(Data Dictionary Cache):緩存數據字典元數據(如用戶名、表空間信息、權限定義等)。數據庫解析 SQL 或編譯 PLSQL 時需頻繁訪問這些信息,緩存命中可減少磁盤 I/O。
  • 服務器結果緩存(Server Result Cache,可選):存儲查詢或 PLSQL 函數的結果,適用于重復執行且結果穩定的場景(如靜態報表查詢)。
  • 保留池(Reserved Pool):共享池內部分割的專用區域,用于分配超過 5KB 的大對象(如大型 PLSQL 包),避免因內存碎片導致的分配失敗。

二、共享池高效使用的核心原則

????????要發揮共享池的性能優勢,需從應用設計和數據庫配置兩方面入手,核心目標是最大化軟解析、減少硬解析

1. 優先使用綁定變量,避免字面量 SQL

????????硬解析的主要誘因之一是 SQL 語句中使用字面量(如SELECT * FROM employees WHERE dept_id=10)而非綁定變量(如SELECT * FROM employees WHERE dept_id=:dept_id)。字面量 SQL 即使邏輯相同,也會被視為不同語句,導致庫緩存無法重用。

  • 實踐建議
    • 開發時強制使用綁定變量,避免動態拼接含字面量的 SQL;
    • 對無法修改的 legacy 應用,可通過設置CURSOR_SHARING=FORCE(默認EXACT)讓數據庫自動將字面量替換為綁定變量(需注意:可能影響執行計劃適應性,建議結合自適應游標共享使用)。
2. 標準化 SQL 編寫規范

????????Oracle 判斷 SQL 是否可共享的標準是 “完全一致”—— 包括大小寫、空格、注釋、對象引用等。例如以下語句會被視為不同 SQL:

SELECT * FROM employees;
SELECT * FROM Employees; -- 大小寫不同
SELECT *  FROM employees; -- 空格數量不同
  • 實踐建議:統一 SQL 格式(如自動轉為大寫、壓縮空格),避免注釋嵌入 SQL;使用顯式對象所有者(如hr.employees)而非依賴公有同義詞。
3. 控制游標生命周期,減少解析頻率

頻繁關閉和重新打開游標會導致重復解析。應根據 SQL 執行頻率優化游標管理:

  • 對高頻執行的 SQL(如 OLTP 核心交易),保持游標打開并重用(如通過 OCI 保留游標、JDBC 設置語句緩存);
  • 對低頻執行的 SQL,可關閉游標釋放內存,避免長期占用共享池。
4. 避免高峰時段執行 DDL

DDL 操作(如ALTER TABLE)會導致依賴的 SQL 失效(INVALIDATIONS),觸發大量硬解析。例如修改表結構后,所有引用該表的 SQL 需重新解析。

  • 實踐建議:DDL 盡量在低峰期執行;執行后可通過DBMS_SHARED_POOL.KEEP將核心 SQL 重新固定到共享池。

三、共享池的配置與調優

共享池的調優核心是 “合理 sizing”—— 既保證緩存高頻數據,又不浪費內存。需結合監控指標動態調整。

1. 共享池大小調整(SHARED_POOL_SIZE)
  • 初始配置:OLTP 系統建議共享池占 SGA 的 20%-30%;DSS 系統可適當降低(因 SQL 重復率低)。
  • 監控指標
    • 通過V$LIBRARYCACHE查看RELOADS(緩存項被換出后重新加載的次數):理想值接近 0,若持續增長需增大共享池;
    • 通過V$ROWCACHE計算數據字典緩存命中率:(SUM(gets - getmisses)/SUM(gets))*100,應高于 90%;
    • 通過V$SGASTAT查看共享池 “free memory”:長期空閑內存過多說明配置過大,需縮減。
  • 調整方法:通過ALTER SYSTEM SET SHARED_POOL_SIZE = <size>M;動態調整(需確保 SGA 有足夠余量)。
2. 保留池配置(SHARED_POOL_RESERVED_SIZE)

保留池用于大對象分配,默認值為共享池的 5%。若大對象分配頻繁失敗(如 PLSQL 包編譯報錯),需調整:

  • 監控指標V$SHARED_POOL_RESERVED中的REQUEST_FAILURES(分配失敗次數):若大于 0 且增長,需增大保留池;
  • 配置原則SHARED_POOL_RESERVED_SIZE建議不超過共享池的 10%(避免擠壓普通緩存區),調整時需同步增大SHARED_POOL_SIZE(保留池從共享池中劃分)。
3. 游標緩存與固定(減少換出)
  • 會話游標緩存:通過SESSION_CACHED_CURSORS設置每個會話緩存的關閉游標數量(默認 50),減少重復解析。可通過V$SESSTAT中 “session cursor cache hits” 監控命中率,若低于 5% 需增大該值。
  • 固定核心對象:通過DBMS_SHARED_POOL.KEEP將高頻使用的 SQL、PLSQL 包固定在共享池(避免被 LRU 算法換出),例如:
    -- 固定指定SQL(需先獲取SQL_ID)
    SELECT address, hash_value FROM v$sql WHERE sql_id = 'abc123';
    EXEC DBMS_SHARED_POOL.KEEP(address => '<address>', flag => 'C');
    

大池:隔離大型內存分配,減少共享池碎片

大池是獨立于共享池的內存區域,專為大型內存分配設計(如共享服務器會話內存、并行查詢緩沖區、RMAN 備份緩沖區)。其核心價值是避免大型分配導致共享池碎片化,保障庫緩存和字典緩存的穩定性。

一、大池的適用場景

大池并非必需組件,但在以下場景中建議配置:

  • 共享服務器架構:共享服務器的 UGA(用戶全局區)需從大池分配(而非共享池),避免擠占 SQL 緩存內存;
  • 并行查詢:并行執行的消息緩沖區從大池分配,減少共享池壓力;
  • RMAN 備份 / 恢復:RMAN 的 I/O 緩沖區(通常數百 KB)從大池分配,避免共享池碎片。

二、大池的配置與調優

大池無 LRU 機制(不會主動換出對象),配置需基于實際內存需求。

1. 大池大小調整(LARGE_POOL_SIZE)
  • 初始配置:根據使用場景估算:
    • 共享服務器:每個會話約需 200-300KB,按最大并發會話數計算(如 100 會話需 30MB);
    • 并行查詢:每個并行服務器進程約需 1-2MB,按最大并行度計算;
    • RMAN:單通道約需 1-4MB,按并發通道數計算。
  • 監控指標:通過V$SGASTAT查看大池 “free memory”:若長期不足(頻繁分配失敗)需增大,若長期空閑需縮減;
  • 配置方法ALTER SYSTEM SET LARGE_POOL_SIZE = <size>M;(最小 300KB)。
2. 避免大池與共享池競爭

大池和共享池均屬于 SGA,需合理分配總內存:

  • 若同時使用共享服務器和大量 SQL 解析,需優先保證共享池大小;
  • 大池僅分配必要內存(無需預留過多),避免擠壓其他 SGA 組件(如緩沖區緩存)。

自動管理與手動調優的選擇

Oracle 提供自動內存管理(AMM)和自動共享內存管理(ASMM),可自動調整共享池和大池大小:

  • AMM(MEMORY_TARGET):完全自動管理 SGA 和 PGA,無需手動設置SHARED_POOL_SIZE等參數;
  • ASMM(SGA_TARGET):自動調整 SGA 內部組件(包括共享池、大池),可指定SHARED_POOL_SIZE為最小值。

建議:對于復雜環境(如混合 OLTP 和 DSS),可啟用 ASMM 并設置共享池和大池的最小值,兼顧自動調整與核心需求;簡單環境可直接使用 AMM 減少運維成本。

總結:共享池與大池調優的核心思路

共享池和大池的調優本質是 “平衡緩存效率與內存利用率”:

  • 共享池需聚焦 “減少硬解析”—— 通過綁定變量、標準化 SQL、合理 sizing 實現;
  • 大池需聚焦 “隔離大分配”—— 在共享服務器、并行查詢等場景中配置,避免共享池碎片化。

實際調優中,需結合V$LIBRARYCACHEV$ROWCACHEV$SGASTAT等視圖監控實時狀態,避免 “一刀切” 配置。記住:最優配置永遠基于實際 workload,而非理論值。

如需更詳細的參數說明,可參考 Oracle 官方文檔:Tuning the Shared Pool and the Large Pool。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89963.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# Lambdab表達式 Var 類

Lambdab 是用于創建一個方法的表達式Func<參數1類型, 參數2類型, 返回值類型> fnName >(參數1 參數2) {方法代碼體}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//調用時和普通方法一致 Console.WriteLine(fnName(10,20)); // false…

【Python】常見模塊及其用法

文章目錄1. 什么是模塊和包&#xff1f;2. 常見的模塊及其用法2.1 time概覽2.1.1 時間獲取方法2.1.2 時間格式化與解析2.1.3 程序計時與延遲2.1.4 時間轉換2.2 random概覽2.2.1 基本隨機數2.2.2 隨機整數2.2.3 序列操作2.2.4 概率分布2.2.5 隨機種子2.2.6 狀態管理2.3 os概覽2.…

洛谷 P3478 [POI 2008] STA-Station

【題目鏈接】 洛谷 P3478 [POI 2008] STA-Station 【題目考點】 1. 樹形動規&#xff1a;換根動規 換根動規&#xff0c;又名二次掃描法&#xff0c;一般是給一顆不定根樹&#xff0c;通過兩次掃描來求解。 我們可以先任選一個根結點root&#xff0c;通過樹形動規的思想計算…

【爬蟲】03 - 爬蟲的基本數據存儲

爬蟲03 - 爬蟲的數據存儲 文章目錄爬蟲03 - 爬蟲的數據存儲一&#xff1a;CSV數據存儲1&#xff1a;基本介紹2&#xff1a;基本使用3&#xff1a;高級使用4&#xff1a;使用示例二&#xff1a;JSON數據存儲1&#xff1a;基礎json讀寫2&#xff1a;字符串和對象的轉換3&#xff…

深入分析計算機網絡數據鏈路層和網絡層面試題

計算機網絡體系結構1. 請簡述 OSI 七層模型和 TCP/IP 四層模型&#xff0c;并比較它們的異同。OSI 七層模型&#xff1a;應用層&#xff1a;直接為用戶的應用進程提供服務&#xff0c;如 HTTP&#xff08;超文本傳輸協議&#xff0c;用于 Web 瀏覽器與服務器通信&#xff09;、…

云服務器新裝的mysql8,無法通過遠程連接,然后本地pymysql也連不上

阿里云服務器&#xff0c;用apt-get新裝的mysql-server&#xff0c;竟然無法通過遠程連接到&#xff0c;竟然是這個原因。不是防火墻&#xff0c;iptables早就關了。也不是安全組&#xff0c;不是人為限制訪問的話&#xff0c;根本沒必要弄安全組 排查過程 netstat -antop|grep…

質量即服務:從測試策略到平臺運營的全鏈路作戰手冊

&#xff08;零&#xff09;為什么需要“質量即服務” 當業務方說“今晚一定要上線”&#xff0c; 當開發說“我只改了兩行代碼”&#xff0c; 當運維說“回滾窗口只有 5 分鐘”&#xff0c; 質量必須像水電一樣隨取隨用&#xff0c;而不是上線前的大壩泄洪。 這篇手冊提供一張…

Java -- 自定義異常--Wrapper類--String類

自定義異常&#xff1a;概念&#xff1a;當程序中出現了某些錯誤&#xff0c;但該錯誤信息并沒有在Throwable子類中描述處理&#xff0c;這個時候可以自己設計異常&#xff0c;用于描述該錯誤信息。步驟&#xff1a;1. 定義類&#xff1a;自定義異常類名&#xff08;程序員自己…

一文速通《線性方程組》

目錄 一、解題必記知識點 二、解題必備技巧 三、非齊次線性方程組求解 四、齊次線性方程組求解 ★五、解析題目信息&#xff0c;獲取暗含條件 一、解題必記知識點 (1) (2)基礎解系線性無關&#xff0c;基礎解系 解空間的一個基&#xff0c;基 一組線性無關的、能夠生…

【Django】DRF API版本和解析器

講解 Python3 下 Django REST Framework (DRF) API 版本控制解析器&#xff08;Parser&#xff09;一、DRF API 版本控制詳解 API 版本控制是構建健壯、可維護的 RESTful API 的關鍵&#xff0c;尤其在項目演進中需要兼容不同版本的客戶端請求。 1.1 API 版本控制的核心原理 AP…

Windows系統暫停更新工具

功能說明 暫停更新至2999年恢復系統更新徹底禁用更新&#xff08;不可逆&#xff09; 使用方法 下載解壓后雙擊運行 .bat 文件 輸入數字選擇功能&#xff1a; 輸入 1&#xff1a;暫停更新至2999年&#xff08;推薦&#xff09;輸入 2&#xff1a;恢復系統更新輸入 3&#xf…

git push新版問題解決

git 好像不能通過username:password的方式來git push了。但我的電腦依然彈出username和password的彈窗。轉戰ssh來git push。由于之前是用git clone克隆的&#xff0c;需要再轉換成ssh的url來git push。

PyCharm + AI 輔助編程

PyCharm AI&#xff1a;初學者友好的 2 個實用場景&#xff08;附操作步驟&#xff09; PyCharm 專業版&#xff08;或通過插件集成&#xff09;支持 AI 輔助編程&#xff08;如 JetBrains AI 或 GitHub Copilot&#xff09;&#xff0c;能根據代碼上下文自動生成代碼、解釋邏…

瘋狂星期四文案網第15天運營日記

網站運營第15天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 昨日訪問量 昨天只有20來ip, 太慘了&#xff0c;感覺和最近沒有發新段子有關&#xff0c;也沒有發新的外鏈&#xff0c;不知道這周四會怎么樣 昨日搜…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘Cython’問題 摘要 在使用 PyCharm 控制臺或命令行執行 pip install Cython 時&#xff0c;常會遇到 ModuleNotFoundError: No module named Cython 的報錯。本…

freertos任務調度關鍵函數理解 vTaskSwitchContext

void vTaskSwitchContext(void) {//my_printf( "uxSchedulerSuspended %d\n", uxSchedulerSuspended );/* 調度器處于掛起狀態 */if (uxSchedulerSuspended ! (UBaseType_t)pdFALSE) {/*** The scheduler is currently suspended - do not allow a context* switch.…

CPU 密集型 和 I/O 密集型 任務

文章目錄**CPU 密集型任務&#xff08;CPU-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化 CPU 密集型任務&#xff1a;**I/O 密集型任務&#xff08;I/O-bound&#xff09;**定義&#xff1a;特點&#xff1a;常見場景&#xff1a;如何優化…

[2025CVPR-小目標檢測方向]基于特征信息驅動位置高斯分布估計微小目標檢測模型

核心問題 ?小目標檢測性能差&#xff1a;?? 盡管通用目標檢測器&#xff08;如 Faster R-CNN, YOLO, SSD&#xff09;在常規目標上表現出色&#xff0c;但在檢測微小目標&#xff08;如 AI-TOD 基準定義的&#xff1a;非常小目標 2-8 像素&#xff0c;小目標 8-16 像素&…

三大工廠設計模式

1.簡單工廠模式1.1需求入手從需求進行入手&#xff0c;可以更深入的理解什么是設計模式。有一個制作披薩的需求&#xff1a;需要便于擴展披薩的種類&#xff0c;便于維護。1.披薩的種類有很多&#xff1a;GreekPizz&#xff0c;CheesePizz等2.披薩的制作流程&#xff1a;prepar…

SpringBoot--Mapper XML 和 Mapper 接口在不同包

&#x1f9e9; 背景說明在 Spring Boot 中&#xff0c;MyBatis 默認要求 Mapper 接口和 XML 文件位于相同包路徑。 但在實際項目中&#xff0c;為了模塊化或結構清晰&#xff0c;常將 XML 放在 resources/mybatis/... 下&#xff0c;這種做法就必須進行額外配置。&#x1f4c1;…