21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴們,有沒有遷移數據庫完畢后或是突然某一天在同一個實例上同樣的SQL,

性能不一樣了、業務反饋卡頓、業務超時等各種匪夷所思的現狀。

于是SPM定位開始,OCM考試中SPM必考。

其他的AWR、ASH、SQLHC、SQLT、SQL profile等換作下一個話題,下次填坑。

Oracle SQL Plan Management(SPM)是一種通過控制執行計劃穩定性來優化SQL性能的內置機制,其核心原理是通過基線(Baseline)機制管理執行計劃的演進,避免因計劃突變導致的性能下降。

一、使用場景

當SQL語句的執行計劃因統計信息更新、數據庫升級、參數調整或索引變更等因素發生變化時,
可能導致性能嚴重下降(比如沒有用索引,使用了全表掃描替代索引掃描)。
關鍵業務SQL保護?:為核心交易SQL綁定已驗證的高效執行計劃。
?灰度驗證新計劃?:通過演化機制(Evolution)測試新計劃性能,僅當優于基線時才啟用。
?遷移與升級保障?:在版本升級或硬件變更時維持執行計劃一致性。
SPM通過下面步驟定位和解決:
  • 基線(Baseline)機制:記錄已知性能良好的執行計劃,新生成的計劃需驗證性能后才被采納。
  • 演進控制:新計劃必須證明優于或等于基線計劃,否則仍使用原計劃。

二、關鍵組件?

  • ?Plan History?:存儲SQL所有曾使用的執行計劃(包括未驗證的)。
  • ?Plan Baseline?:Plan History的子集,僅包含已驗證(ACCEPTED)且穩定的高效計劃。
  • ?SQL Management Base :存儲SPM元數據的字典表(位于SYSAUX表空間)。

三、原理解析:工作流程?

?1. 計劃捕獲(Plan Capture)??
  • ?自動捕獲? (需設置參數OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE):
  • 首次執行的SQL生成計劃后,該計劃作為初始基線(標記為ENABLED和ACCEPTED)。
  • 后續新計劃進入Plan History,但狀態為ENABLED, NOT ACCEPTED,需經性能驗證才可加入基線。
  • ?手動捕獲?:
    • 通過DBMS_SPM包從共享池、SQL調優集(STS)或存儲大綱導入計劃。
?2. 計劃選擇(Plan Selection)??
  • ?優化器決策流程?(需啟用OPTIMIZER_USE_SQL_PLAN_BASELINES=TRUE):
2.1 正常解析SQL,生成新執行計劃(成本最低)。
2.2 檢查是否存在匹配的SQL Plan Baseline:
    • 若存在ACCEPTED計劃 → 直接使用該計劃。
    • 若新計劃不在Baseline中 → 將其加入Plan History(狀態為NOT ACCEPTED)。
2.3實時回退機制(Oracle 23ai新特性)? ?:
    • 若新計劃性能劣化(如邏輯讀激增),自動回退至Baseline中的最優計劃。
?3. 計劃演進(Plan Evolution)??
  • ?自動演進?:
    • 任務SYS_AUTO_SPM_EVOLVE_TASK定期檢查未ACCEPTED的計劃,通過性能對比(如CPU時間、I/O消耗)決定是否采納。
    • 參數ACCEPT_PLANS控制是否自動接受更優計劃(默認TRUE)。
  • ?手動演進?:
    • 使用 DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE()測試并接受新計劃。

四、?Oracle 23 ai 的SPM特性增強:

Real-Time SQL Plan Management (實時SPM)
  • 變化:新增實時檢測和修復性能退化的執行計劃,無需等待自動任務或手動干預。從捕獲、驗證到演進全程自動化,減少人工維護成本。
  • 原理:持續監控SQL執行性能,若新計劃比基線計劃慢,自動回退到基線計劃并標記新計劃為"UNACCEPTED"。深度集成SQL Monitor?,秒級檢測執行計劃性能退化,自動切換至歷史最優計劃,無需DBA干預。
  • 優勢:減少因計劃突變導致的性能風險,尤其適合關鍵業務SQL。
與AI Vector Search集成
  • 變化:SPM可管理含AI向量搜索的SQL執行計劃(如"VECTOR_DISTANCE()"函數)。
  • 原理:優化器為向量搜索SQL生成計劃時,SPM基線會記錄并驗證其效率。
  • 示例場景:相似性搜索(如"WHERE VECTOR_DISTANCE(embedding, :vec) < 1")的計劃穩定性增強。
Raft復制支持下的分布式SPM
  • 變化:在Globally Distributed Database中,SPM基線支持跨分片同步。
  • 原理:通過Raft共識協議復制基線計劃,確保分布式環境下計劃一致性。
增強與In-Memory的協同
  • 變化:SPM優先選擇利用In-Memory列存儲(如內存連接組)的高效計劃。
  • 原理:當"INMEMORY_AUTOMATIC_LEVEL=HIGH"時,SPM自動采納內存優化計劃。

五、配置和實操

?1. 啟用實時SPM?
-- 啟用自動捕獲SQL計劃基線
SYS@FREE> ALTER SYSTEM SET OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES = TRUE;
System altered
-- 啟用實時SPM(默認開啟,驗證狀態)
SYS@FREE> SELECT value FROM v$parameter WHERE name = 'optimizer_use_sql_plan_baselines';
VALUE
------------------------------------------------------------------------------------------------------------------------
TRUE
-- 返回值應為 TRUE
2. 驗證實時SPM回退機制?
-- 步驟1: 創建測試表
CREATE TABLE spm_test (id NUMBER, data VARCHAR2(100));
INSERT INTO spm_test SELECT rownum, 'Data'||rownum FROM dual CONNECT BY LEVEL <= 10000;
COMMIT;-- 步驟2: 首次執行(生成初始計劃)
SYS@CDB$ROOT> SELECT /*+ REAL_TIME_SPM_TEST */ * FROM spm_test WHERE id = 500;ID DATA
______ __________500 Data500-- 步驟3: 可以嘗試刪除索引
DROP INDEX IF EXISTS spm_test_idx;-- 先創建索引再刪除
CREATE INDEX spm_test_idx ON spm_test(id); -- 先創建索引再刪除,模擬計劃突變-- 步驟4: 再次執行相同SQL
SELECT /*+ REAL_TIME_SPM_TEST */ * FROM spm_test WHERE id = 500; 
-- 觀察執行計劃是否回退到全表掃描(原最優計劃為索引掃描)

3. 監控SPM狀態??

--- 查看已捕獲的SQL計劃基線,查詢 SPM 捕獲結果
SELECT sql_handle, plan_name, enabled, accepted,optimizer_cost,origin AS capture_source  -- 顯示來源為 REAL-TIME
FROM dba_sql_plan_baselines 
WHERE sql_text LIKE '%REAL_TIME_SPM_TEST%';SQL_HANDLE              PLAN_NAME                         ENABLED    ACCEPTED       OPTIMIZER_COST CAPTURE_SOURCE
_______________________ _________________________________ __________ ___________ _________________ _________________
SQL_64b41bf95ca6b6c6    SQL_PLAN_69d0vz5faddq691cb0adf    YES        NO                          2 AUTO-CAPTURE
SQL_64b41bf95ca6b6c6    SQL_PLAN_69d0vz5faddq696d17023    YES        YES                         1 AUTO-CAPTURE
SQL_64b41bf95ca6b6c6    SQL_PLAN_69d0vz5faddq6f2fc655a    YES        NO                          9 AUTO-CAPTURE
SQL_b1986790bdca8230    SQL_PLAN_b3637k2ywp0jh6ded1a00    YES        YES                         2 AUTO-CAPTURE
SQL_6cf7d7301796c616    SQL_PLAN_6txyr60btdjhq6ded1a00    YES        YES                         2 AUTO-CAPTURE
SQL_9b8aec55051bcab5    SQL_PLAN_9r2rcan2jrkpp6ded1a00    YES        YES                         2 AUTO-CAPTURE
SQL_9cd99fe508c1b86c    SQL_PLAN_9tqczwn4c3f3cb73cade2    YES        YES                         0 AUTO-CAPTURE
--
-- 檢查實時回退事件
SELECT sql_id, PLAN_HASH_VALUE
FROM v$sql
WHERE sql_text LIKE '%REAL_TIME_SPM_TEST%';
--
SQL_ID              PLAN_HASH_VALUE
________________ __________________
aq357chxcs0kd             903671040
6xphsvkrns1q1            2664986145
g86t44cwf41r8            2664986145
g03qt7845c4pv             903671040
ajhtavdx2s5t9            2664986145
6kma5qad96t0n            2664986145
6kma5qad96t0n            2664986145
111gdsdj2ft3g            1155944573
6110vngy8zkm4             9036710409 rows selected.-- 方案1:SQL Monitor報告(需SQL_ID)
SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR(sql_id => '161f318vx0y63') FROM DUAL;
-- 報告中的Note部分會標注SPM回退事件
SYS@CDB$ROOT> SELECT DBMS_SQL_MONITOR.REPORT_SQL_MONITOR FROM DUAL;
REPORT_SQL_MONITOR
_______________________________________________________________________________________________________________________________
SQL Monitoring Report
SQL Text
------------------------------
begin dbms_swrf_internal.awr_imp(dmpfile=> :mpk_name, dmpdir=>:mbloc, new_dbid=>:dbid, mbtype=>:mbtype, mbcred=>:cred); end;
Global Information
------------------------------Status              :  DONEInstance ID         :  1Session             :  SYS (205:3673)SQL ID              :  161f318vx0y63SQL Execution ID    :  16777217Execution Started   :  06/08/2025 19:58:55First Refresh Time  :  06/08/2025 19:59:00Last Refresh Time   :  06/08/2025 19:59:01Duration            :  6sModule/Action       :  MMON_SLAVE/AWR Warehouse Auto-ImportService             :  SYS$BACKGROUNDProgram             :  oracle@OL96 (M003)Global Stats
===============================================================================================================
| Elapsed |   Cpu   |    IO    | Application | Concurrency |  Other   | Buffer | Read | Read  | Write | Write |
| Time(s) | Time(s) | Waits(s) |  Waits(s)   |  Waits(s)   | Waits(s) |  Gets  | Reqs | Bytes | Reqs  | Bytes |
===============================================================================================================
|    6.65 |    5.70 |     0.07 |        0.00 |        0.75 |     0.12 |   108K | 1468 |  19MB |     1 |  8192 |
===============================================================================================================-- 方案2:檢查計劃基線狀態
SELECT sql_handle, plan_name, enabled, accepted, origin 
FROM DBA_SQL_PLAN_BASELINES 
WHERE sql_text LIKE '%REAL_TIME_SPM_TEST%'
AND origin = 'AUTO-CAPTURE';
-- 若accepted=YES且origin為自動捕獲,說明回退成功
----- 檢查演進任務報告
SYS@CDB$ROOT> SELECT DBMS_SPM.report_auto_evolve_task FROM dual;REPORT_AUTO_EVOLVE_TASK
________________________________________________________________________________________________
GENERAL INFORMATION SECTION
---------------------------------------------------------------------------------------------Task Information:---------------------------------------------Task Name            : SYS_AUTO_SPM_EVOLVE_TASKTask Owner           : SYSDescription          : Automatic SPM Evolve TaskExecution Name       : EXEC_280Execution Type       : SPM EVOLVEScope                : COMPREHENSIVEStatus               : COMPLETEDStarted              : 06/08/2025 14:00:13Finished             : 06/08/2025 14:00:14Last Updated         : 06/08/2025 14:00:14Global Time Limit    : 3600Per-Plan Time Limit  : UNUSEDNumber of Errors     : 0
---------------------------------------------------------------------------------------------SUMMARY SECTION
---------------------------------------------------------------------------------------------Number of plans processed  : 0Number of findings         : 0Number of recommendations  : 0Number of errors           : 0
---------------------------------------------------------------------------------------------
SYS@CDB$ROOT>

六、高級管理腳本?

?1. 手動固定最優計劃?
--- 查找SQL的SQL_HANDLE
DECLAREl_plans PLS_INTEGER;
BEGINl_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => 'XXXXXXX' -- 替換為實際SQL_ID);
END;
/

?2. 主動演化計劃基線

--- 測試并采納新計劃
SYS@CDB$ROOT> SET SERVEROUTPUT ON
SYS@CDB$ROOT> DECLARE2    r_report CLOB;3  BEGIN4    r_report := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(5      sql_handle => 'SQL_9cd99fe508c1b86c' -- 替換為實際SQL_HANDLE6    );7    DBMS_OUTPUT.PUT_LINE(r_report);8  END;9* /
GENERAL INFORMATION SECTION
---------------------------------------------------------------------------------------------Task Information:---------------------------------------------Task Name            : TASK_362Task Owner           : SYSExecution Name       : EXEC_322Execution Type       : SPM EVOLVEScope                : COMPREHENSIVEStatus               : COMPLETEDStarted              : 06/09/2025 14:58:35Finished             : 06/09/2025 14:58:35Last Updated         : 06/09/2025 14:58:35Global Time Limit    : 2147483646Per-Plan Time Limit  : UNUSEDNumber of Errors     : 0
---------------------------------------------------------------------------------------------SUMMARY SECTION
---------------------------------------------------------------------------------------------Number of plans processed  : 0Number of findings         : 0Number of recommendations  : 0Number of errors           : 0
---------------------------------------------------------------------------------------------PL/SQL procedure successfully completed.SYS@CDB$ROOT>

七、驗證建議?

  • 1.使用EXPLAIN PLAN FOR對比回退前后的執行計劃差異。
  • 2.結合V$SQL_PLAN和DBA_SQL_PLAN_BASELINES驗證計劃切換記錄。
  • 3.在測試環境模擬高并發場景,觀察SPM對穩定性的提升效果。
效果可能因環境配置而異,建議結合AWR報告和SQL Tuning Advisor進一步優化。

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

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

相關文章

[Linux] 命令行管理文件

目錄 FHS 文件路徑導航 ls命令 tree命令 stat命令 touch命令 命令行管理文件 mkdir命令 cp命令 mv命令 rm和rmdir命令 軟鏈接 硬鏈接 軟連接硬鏈接區別 shell擴展匹配文件 FHS FHS采用樹形結構組織文件&#xff0c;定義了系統中每個區域的用途、所需要的最小構…

自動化過程中,如何定位一閃而過的toast?

MutationObserver實戰&#xff1a;動態捕獲頁面Toast消息的終極解決方案 一、代碼全景解析 const observer new MutationObserver((mutations) > {// 回調函數主體... });observer.observe(document.body, {childList: true,subtree: true });核心組件解析 組件作用重要…

基于 Three.js 的數字雨波紋效果技術解析

文章目錄 一、基礎環境搭建與 Three.js 引入?二、場景與相機設置?三、后期處理:光暈效果的實現?四、紋理創建:定制雨滴、波紋和水花外觀?五、粒子系統:模擬雨滴下落與交互?1,雨滴粒子系統?2,波紋與水花系統?六、動畫循環與交互響應?本文將深入剖析一段實現該效果的…

聯想拯救者R9000P 網卡 Realtek 8852CE Ubuntu/Mint linux 系統睡眠后,無線網卡失效

聯想拯救者R9000P 網卡型號 Realtek PCle GbE Family Controller Realtek 8852CE WiFi 6E PCI-E NIC 系統版本 Ubuntu 24.04 / mint 22.1 問題現象 rtw89_8852ce&#xff0c;Link is Down&#xff0c;xtal si not ready&#xff0c;mac init fail&#xff0c;xtal si not …

Java詳解LeetCode 熱題 100(26):LeetCode 142. 環形鏈表 II(Linked List Cycle II)詳解

文章目錄 1. 題目描述1.1 鏈表節點定義 2. 理解題目2.1 問題可視化2.2 核心挑戰 3. 解法一&#xff1a;HashSet 標記訪問法3.1 算法思路3.2 Java代碼實現3.3 詳細執行過程演示3.4 執行結果示例3.5 復雜度分析3.6 優缺點分析 4. 解法二&#xff1a;Floyd 快慢指針法&#xff08;…

安寶特科技丨Pixee Medical產品獲FDA認證 AR技術賦能骨科手術智能化

法國醫療科技企業Pixee Medical宣布&#xff0c;其研發的智能骨科手術導航系統 Knee NexSight 解決方案正式通過美國食品藥品監督管理局&#xff08;FDA&#xff09;510(k)認證&#xff0c;標志著增強現實&#xff08;AR&#xff09;技術在醫療領域的商業化應用邁出關鍵一步。 …

操作系統的概念,功能和目標

小懶來了&#xff01; 操作系統學習正式開始&#xff0c;day1是小懶O&#xff01; Using blogs to organize and understand knowledge is a good way, lets learn, operating systems Chapter 1,Lets look at it &#xff08;一&#xff09;預備知識 一.什么是接口 1.假設我…

STM32使用水位傳感器

1.1 介紹&#xff1a; 水位傳感器專為水深檢測而設計&#xff0c;可廣泛用于感應降雨&#xff0c;水位&#xff0c;甚至液體泄漏。當將水位傳感器放入水中時&#xff0c;水位沒過銅線越多模擬值越大&#xff0c;讀取水深傳感器模塊的模擬值&#xff0c;在串口打印出來&#xf…

Spring事務傳播機制有哪些?

導語&#xff1a; Spring事務傳播機制是后端面試中的必考知識點&#xff0c;特別容易出現在“項目細節挖掘”階段。面試官通過它來判斷你是否真正理解事務控制的本質與異常傳播機制。本文將從實戰與源碼角度出發&#xff0c;全面剖析Spring事務傳播機制&#xff0c;幫助你答得有…

相機Camera日志實例分析之一:相機Camx【前置慢動作分辨率切換720P、1080P錄制】單幀流程日志詳解

【關注我&#xff0c;后續持續新增專題博文&#xff0c;謝謝&#xff01;&#xff01;&#xff01;】 上一篇我們講了&#xff1a; 這一篇我們開始講&#xff1a; 目錄 一、場景操作步驟 二、日志基礎關鍵字分級如下 三、場景日志如下&#xff1a; 一、場景操作步驟 1、打…

OpenHarmony標準系統-HDF框架之I2C驅動開發

文章目錄 引言I2C基礎知識概念和特性協議&#xff0c;四種信號組合 I2C調試手段硬件軟件 HDF框架下的I2C設備驅動案例描述驅動Dispatch驅動讀寫 總結 引言 I2C基礎知識 概念和特性 集成電路總線&#xff0c;由串網12C(1C、12C、Inter-Integrated Circuit BUS)行數據線SDA和串…

Ubuntu系統下交叉編譯openssl

一、參考資料 OpenSSL&&libcurl庫的交叉編譯 - hesetone - 博客園 二、準備工作 1. 編譯環境 宿主機&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉編譯器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 設置交叉編譯工具鏈 在交叉編譯之前&#x…

數據庫優化實戰分享:高頻場景下的性能調優技巧與案例解析

在實際開發與生產運維中&#xff0c;數據庫的性能瓶頸往往是影響系統響應速度和用戶體驗的關鍵因素。尤其是在高并發訪問、海量數據處理、復雜查詢邏輯等高頻場景下&#xff0c;數據庫優化不僅僅是“錦上添花”&#xff0c;更是“雪中送炭”。本篇博文將結合實際項目經驗&#…

Python importlib 動態加載

文章目錄 1. importlib 庫 概述2. 導入模塊&#xff08;import_module()&#xff09;2.1. 導入已安裝的模塊2.2. 導入子模塊2.3 通過字符串變量導入模塊 3. 重新加載模塊&#xff08;reload()&#xff09;4. 檢查模塊是否存在&#xff08;find_spec()&#xff09;5. 獲取模塊路…

(1-6-4) Java IO流實現文件的讀取與寫入

目錄 0.前述概要 1. File類 1.1 概述 1.2 File的重要方法 1.3 java.io 1.3.1 四種抽象類 1.3.2 流 1.3.3 其他常用 I/O 流 2. 字節輸入流&#xff08;InputSteam&#xff09; 2.1 關系類圖 2.2 應用實現 3. 字節輸出流&#xff08;OutputStream&#xff09; 3.1 …

【Proteus仿真】【32單片機-A010】步進電機控制系統設計

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 聯系作者 一、主要功能 1、LCD顯示當前擋位、方向等&#xff1b; 2、按鍵控制步進電機擋位、方向等。 二、使用步驟 系統運行后&#xff0c;LCD1602顯示當前擋位、方向&#xff1b; 通過按鍵…

DeepSeek-R1-0528-Qwen3-8B為底座微調領域大模型準備:制作領域專用數據集

前言 想要微調領域大模型,數據的準備是必不可少的。然而微調大模型需要的數據極多,這樣花費很多人力和準備。有沒有方便又高效的方法?一下子就可以準備大量的領域專用數據集呢? 制作領域專用數據集 這里制作的數據集格式為使用的aphaca格式的 1.啟動vllm服務 python -m…

WEB3全棧開發——面試專業技能點P6后端框架 / 微服務設計

一、Express Express是國內大部分公司重點問的。我在本文最后&#xff0c;單獨講解了Express框架。 概念介紹 Express 是基于 Node.js 平臺的極簡、靈活且廣泛使用的 Web 應用框架。它提供了一系列強大的功能&#xff0c;用于構建單頁、多頁及混合型的 Web 應用程序和 API 服…

游戲開發中的CI/CD優化案例:知名游戲公司Gearbox使用TeamCity簡化CI/CD流程

案例背景 關于Gearbox&#xff1a; Gearbox 是一家美國電子游戲公司&#xff0c;總部位于德克薩斯州弗里斯科&#xff0c;靠近達拉斯。Gearbox 成立于1999年&#xff0c;推出過多款史上最具代表性的視頻游戲&#xff0c;包括《半衰期》、《戰火兄弟連》以及《無主之地》。 團隊…

視覺slam--三維剛體運動

線性代數 外積與矩陣乘法的等價性 歐拉角的奇異性--萬向死鎖 現象 第二個軸旋轉度&#xff0c;會導致第三個旋轉軸和惡原始坐標軸的第一個旋轉軸重合&#xff0c;導致第一次旋轉與第三次旋轉都使用了同一個軸進行旋轉&#xff0c;也就是本質上旋轉三次&#xff0c;但是只在兩個…