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

oracle怎样通过固化较优执行计划来优化慢sql

一 问题描述

有次生产环境cpu使用率增高,ADDM报告提示某条sql比较耗费cpu:

提示:

在分析期间, 此 SQL 语句至少利用了 6 个不同的执行计划

#查看该sql都有哪些执行计划

SELECT * 

FROM table(DBMS_XPLAN.DISPLAY_AWR('sqlid值'));

我手动执行这个sql需要5秒。但是我用sql monitor查看发现它执行得超慢,5个多小时了,还没执行完:

发现99%慢在一个表的全表扫描上,但是这个条件字段上是有索引的,它没走索引,走的全表扫描:

我手动执行这个sql(5秒),看它的执行计划这个表是走了索引的。

说明数据库有时选择了错误的执行计划。

二 解决办法

2.1 收集下这个表的统计信息

BEGINDBMS_STATS.GATHER_TABLE_STATS(ownname     => 'schema名称',     -- 表所属的用户(如 HR)tabname     => '表名',      -- 表名(如 EMPLOYEES)estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, -- 自动估算采样比例method_opt  => 'FOR ALL COLUMNS SIZE AUTO',      -- 自动选择直方图列cascade     => TRUE,             -- 同时收集索引的统计信息(默认为 FALSE)degree      => 8,no_invalidate => FALSE           -- 立即使依赖的游标失效(可选));END;/

#查看统计信息

select table_name,num_rows,blocks,last_analyzed from dba_tables where table_name in ('表名') and owner='schema名称';

2.2 固化执行计划

如果收集完表的统计信息,sql还是慢,则固化下执行计划

2.2.1 上传文件coe_xfr_sql_profile.sql

点击这里下载该文件,然后用oracle用户将其上传至/home/oracle目录下

2.2.2 执行coe_xfr_sql_profile.sql,并手动执行其生成的固化sql

# su - oracle

$ sqlplus / as sysdba @/home/oracle/coe_xfr_sql_profile.sql

Parameter 1:
SQL_ID (required)

Enter value for 1: 7arsymf6aatr3      >>>入参1:此处输入需要固化的SQL_ID


PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
     2931187647        .036      >>> 一般选择AVG_ET_SECS最小版本,并记住PLAN_HASH_VALUE值:2931187647
     3394618928      42.585
      894327090     164.624

Parameter 2:
PLAN_HASH_VALUE (required)

Enter value for 2: 2931187647    >>>入参2:此处输入上面AVG_ET_SECS最小耗费资源的PLAN_HASH_VALUE

Values passed:
~~~~~~~~~~~~~
SQL_ID         : "7arsymf6aatr3"
PLAN_HASH_VALUE: "2931187647"


Execute coe_xfr_sql_profile_7arsymf6aatr3_2931187647.sql      >>>>此处为oracle自动生成的SQL固化脚本
on TARGET system in order to create a custom SQL Profile
with plan 2931187647 linked to adjusted sql_text.


COE_XFR_SQL_PROFILE completed.
SQL> @coe_xfr_sql_profile_7arsymf6aatr3_2931187647            >>>>手动执行上面生成的sql脚本
... ...
PL/SQL procedure successfully completed.

... ...
COE_XFR_SQL_PROFILE_7arsymf6aatr3_2931187647 completed     >>>>固化完成。

/*

#

select * from dba_sql_profiles;

*/

2.3 查看下当前会话

看是否还有相关慢sql。收集该表的统计信息和固化执行计划不会影响已经在执行的sql。

这些查询sql如果执行了好几个小时的话,问下业务能否kill。运行那么久没有结果感觉查询下去也没啥意义了,但是还是要谨慎kill,需要问下业务能否kill。

相关文章:

  • ant design pro 项目发布遇到登录页访问404
  • 【免费下载】2012-2023年全国夜间灯光数据
  • 从遍历序列构造二叉树:前序+中序与中序+后序的递归解法详解
  • JavaScript面试问题
  • tbb parallel_for 使用
  • 颜色分类,不靠“调色盘”:双指针 VS 计数排序的正面PK
  • 【Linux】服务自启动设置的方式
  • LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding
  • Java之BigDecimal
  • Silvaco仿真中victory process的蒙特卡洛(Monte Carlo)离子注入
  • 深入理解 Linux 权限管理:从基础到进阶
  • 【GESP】C++三级练习 luogu-B2117 整理药名
  • (三十二)Android开发中AppCompatActivity和Activity之间的详细区别
  • 2025运维工程师面试题1(答案在后一张)
  • 企业的AI转型:生死时速的进化之路
  • 【题解-Acwing】870. 约数个数
  • k8s部署
  • 4.29【Q】paraCompute
  • python之数字类型的操作
  • 无人机航拍羊只检测数据集VOC+YOLO格式6065张1类别
  • 厚重与潮流交织,淮安展现“运河之都”全新城市想象
  • 交通运输部:预计今年五一假期全社会跨区域人员流动量将再创新高
  • 辽宁省全力开展辽阳一饭店火灾事故救援处置工作
  • 美财长称关税战升级的责任在中方,外交部:关税战、贸易战没有赢家
  • “90后”樊鑫履新乌兰察布市察右中旗副旗长人选
  • 教育强国建设基础教育综合改革试点来了!改什么?怎么改?