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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;但是只在两个…