当前位置: 首页 > article >正文

oracle使用SPM控制执行计划

一 SPM介绍

Oracle在11G中推出了SPM(SQL Plan management),SPM是一种主动的稳定执行计划的手段,能够保证只有被验证过的执行计划才会被启用,当由于种种原因(比如统计信息的变更)而导致目标SQL产生了新的执行计划后,这个新的执行计划并不会被马上启用,直到它已经被我们验证过其执行效率会比原先执行计划高才会被启用。

SQL plan baseline中的列ENABLED和ACCEPTED用来描述一个SQL plan baseline所对应的执行计划是否被oracle启用,只有enanled和accepted的值均为yes的SQL plan baseline所对应的执行计划才会被oracle启用,如果一个SQL有超过1个以上的SQL plan baseline的enabled和accepted的值均为yes,则oracle会从中选择成本值最小的一个所对应的执行计划来作为该SQL的执行计划。

当某个sql选择了较慢的执行计划,可以创建一个计划基线,绑定较优执行计划。

注意:SPM需要维护计划基线,这可能会占用一定的数据库资源。因此,在配置SPM时,需要权衡性能稳定性和资源消耗之间的关系。

二 SPM实践

有个慢sql有时执行快,有时执行慢,这里计划为其创建一个计划基线,指定较优执行计划。

2.1检查参数

show parameter OPTIMIZER_USE_SQL_PLAN_BASELINES

#确保结果为查询true

2.2 手动生成SPM

2.2.1确定较优执行计划的plan hash value

SELECT INST_ID,SQL_ID,SQL_TEXT,SQL_FULLTEXT,PLAN_HASH_VALUE,EXECUTIONS,CPU_TIME,ROUND(ELAPSED_TIME/1000,2) as TOTAL_ELAPSED_TIME_S,CASE  WHEN EXECUTIONS = 0 THEN ROUND(ELAPSED_TIME/1000/1,2) ELSE  ROUND(ELAPSED_TIME/1000/EXECUTIONS,2) END AS AVG_ELAPSED_TIME_S,FIRST_LOAD_TIME,LAST_LOAD_TIME,LAST_ACTIVE_TIME,DISK_READS,DIRECT_WRITES,DIRECT_READS,BUFFER_GETS,PARSING_USER_ID,PARSING_SCHEMA_NAME,ADDRESS,HASH_VALUE,MODULE,ACTIONFROM GV$SQLWHERE  SQL_TEXT  NOT  LIKE '%SELECT COMMAND_TYPE,SQL_ID,SQL_TEXT,SQL_FULLTEXT,EXECUTIONS%'AND PARSING_SCHEMA_NAME NOT LIKE '%SYS%' AND PARSING_SCHEMA_NAME NOT IN ('DBSNMP')AND SQL_ID='sqlid值'ORDER BY TOTAL_ELAPSED_TIME_S ASC;

可以看到,第一行执行最快,决定采用这个的执行计划。

2.2.2 建立基线

命令:

var temp number;

exec :temp:=dbms_spm.load_plans_from_cursor_cache(sql_id =>'sqlid值',plan_hash_value =>plan hash value值);

这里是:

var temp number;

exec :temp:=dbms_spm.load_plans_from_cursor_cache(sql_id =>'cbtfh4rvsc45d',plan_hash_value =>2595035735);

2.2.3 查看基线

select sql_handle,plan_name,origin,enabled,accepted,sql_text,created from dba_sql_plan_baselines where sql_text like '%sql文本%';

/*

如果后面需要删除该基线,这这样删除:

删除基线命令示例:

exec :temp:=dbms_spm.drop_sql_plan_baseline(sql_handle =>'SQL_62dd675eafd1bf34',plan_name =>'SQL_PLAN_65rb7burx3gtn30e445f2');

*/

http://www.lryc.cn/news/2384154.html

相关文章:

  • [Java实战]Spring Boot整合Seata:分布式事务一致性解决方案(三十一)
  • Openwrt下使用ffmpeg配合自建RTSP服务器实现推流
  • MySQL 索引的增删改查
  • MySQL Host 被封锁解决方案(全版本适用 + Java 后端优化)
  • wifi 如果检查失败,UI 就会出现延迟或缺失打勾的现象。
  • 点云(point cloud):自动驾驶的“三维扫描图“
  • Redis 中如何保证缓存与数据库的数据一致性?
  • Oracle RAC节点时间差异同步测试
  • python 打卡DAY27
  • 位运算及其算法
  • flutter getx路由管理、状态管理、路由守卫中间件、永久储存get_storage
  • 贪心算法之跳跃游戏问题
  • Dockers Compose常用指令介绍
  • YOLOv11 性能评估与横向对比
  • kafka在线增加分区副本数
  • Unity 如何使用Timeline预览、播放特效
  • GIM发布新版本了 (附rust CLI制作brew bottle流程)
  • GitHub 趋势日报 (2025年05月21日)
  • MySQL篇-其他面试题
  • iOS 蓝牙开发中的 BT 与 BLE
  • Git的工作区,暂存区,本地仓库
  • 鸿蒙Flutter实战:21-混合开发详解-1-概述
  • MySQL错误1419(HY000)解决方案:SUPER权限缺失与二进制日志启用冲突的3种处理方式
  • [架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)
  • 大量程粗糙度轮廓仪适用于哪些材质和表面?
  • linux 查看java的安装路径
  • C 语言程序终止的艺术:理解 return main 与 exit() 函数
  • 数据实时同步:inotify + rsync 实现数据实时同步
  • LeetCode 404.左叶子之和的迭代求解:栈结构与父节点定位的深度解析
  • Unity-编辑器扩展