Oracle SQLTUNING优化SQL

news2024/12/23 0:25:14

在这里插入图片描述
通过AWR的TOPSQL观察到sqlid为6pk9xfmjd0s8j的sql语句耗时1分钟。
在这里插入图片描述
在这里插入图片描述
通过ash观察到,该SQL由于全表扫描占用了大量的IO资源。
在这里插入图片描述
解析执行计划,看到是MED_SALE_ORDER表做了全表扫描。
在这里插入图片描述
该表有678W+条记录,全表扫描必定IO指标会冲高,影响数据库性能。

在不了解业务逻辑的情况下,可以通过Oracle的SQL TUNING工具对该SQL进行优化。

declare
 l_tuning_task varchar2(30);
begin
 l_tuning_task := dbms_sqltune.create_tuning_task(sql_id => '6pk9xfmjd0s8j');
 dbms_sqltune.execute_tuning_task(l_tuning_task);
 dbms_output.put_line(l_tuning_task);
end;
/

创建优化任务,可以通过DBA_ADVISOR_LOG查看任务名称。

col owner for a15
col execution_start for a25
col execution_end for a25
set linesize 200
select owner,task_id,task_name,to_char(execution_start,'yyyy-mm-dd hh24:mi:ss') execution_start,to_char(execution_end,'yyyy-mm-dd hh24:mi:ss') execution_end from dba_advisor_log order by 3;

此次优化过程中,优化任务名称查询出来是TASK_97635。
任务创建完成后,执行优化任务。

BEGIN
  DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'TASK_97635' );
END;
/

通过DBA_ADVISOR_TASKS视图查看任务执行状态,当状态为COMPLETED表示任务执行完成,可以输出优化报告了。

SELECT status 
FROM   DBA_ADVISOR_TASKS 
WHERE  task_name = 'TASK_97635' ;

输出优化报告

SET LONG 10000 
SET LONGCHUNKSIZE 1000
SET LINESIZE 100      
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635' )
FROM   DUAL;

以下是优化报告内容:

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
GENERAL INFORMATION SECTION
-------------------------------------------------------------------------------
Tuning Task Name   : TASK_97635
Tuning Task Owner  : SYS
Workload Type      : Single SQL Statement
Execution Count    : 2
Current Execution  : EXEC_100531
Execution Type     : TUNE SQL
Scope              : COMPREHENSIVE
Time Limit(seconds): 1800
Completion Status  : COMPLETED

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
Started at         : 05/22/2023 17:55:04
Completed at       : 05/22/2023 18:00:47

-------------------------------------------------------------------------------
Schema Name: ZTCX
SQL ID     : 6pk9xfmjd0s8j
SQL Text   :

...

2- Index Finding (see explain plans section below)
--------------------------------------------------
  The execution plan of this statement can be improved by creating one or more
  indices.

  Recommendation (estimated benefit: 99.99%)
  ------------------------------------------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
  - Consider running the Access Advisor to improve the physical schema design
    or creating the recommended index.
    create index OCC_B2B.IDX$$_17D630001 on
    OCC_B2B.MED_SALE_ORDER(TO_NUMBER("PLATFORM_ID"),"ORGANIZATION_ID","DR","TS"
    );

  Rationale
  ---------
    Creating the recommended indices significantly improves the execution plan
    of this statement. However, it might be preferable to run "Access Advisor"
    using a representative SQL workload as opposed to a single statement. This

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
    will allow to get comprehensive index recommendations which takes into
    account index maintenance overhead and additional space consumption.

3- Alternative Plan Finding
---------------------------
  Some alternative execution plans for this statement were found by searching
  the system's real-time and historical performance data.

  The following table lists these plans ranked by their average elapsed time.
  See section "ALTERNATIVE PLANS SECTION" for detailed information on each
  plan.

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------

  id plan hash  last seen            elapsed (s)  origin          note
  -- ---------- -------------------- ------------ --------------- ----------------
   1 1648087086  2023-05-22/15:00:59       13.422 AWR
   2 1676945439  2023-05-22/16:45:01       28.123 Cursor Cache    original plan

  Recommendation
  --------------
  - Consider creating a SQL plan baseline for the plan with the best average
    elapsed time.
    execute dbms_sqltune.create_sql_plan_baseline(task_name => 'TASK_97635',

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
            owner_name => 'SYS', plan_hash_value => 1648087086);

-------------------------------------------------------------------------------
EXPLAIN PLANS SECTION
-------------------------------------------------------------------------------

1- Original
-----------
Plan hash value: 1676945439

----------------------------------------------------------------------------------------------------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
----------
| Id  | Operation                         | Name                     | Rows  | Bytes | Cost (%CPU)|
Time     |
----------------------------------------------------------------------------------------------------
----------
|   0 | SELECT STATEMENT                  |                          |     1 |   328 |   174K  (1)|
00:34:51 |
|   1 |  HASH UNIQUE                      |                          |     1 |   328 |   174K  (1)|
00:34:51 |
|*  2 |   FILTER                          |                          |       |       |            |
         |

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
|   3 |    NESTED LOOPS                   |                          |     1 |   328 |   174K  (1)|
00:34:51 |
|   4 |     NESTED LOOPS                  |                          |     1 |   328 |   174K  (1)|
00:34:51 |
|   5 |      NESTED LOOPS                 |                          |     1 |   267 |   174K  (1)|
00:34:51 |
|   6 |       NESTED LOOPS                |                          |     1 |   204 |   174K  (1)|
00:34:51 |
|*  7 |        TABLE ACCESS FULL          | MED_SALE_ORDER           |     1 |   117 |   174K  (1)|
00:34:51 |
|*  8 |        TABLE ACCESS BY INDEX ROWID| MED_SALE_ORDER_ITEM      |     2 |   174 |     4   (0)|

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
00:00:01 |
|*  9 |         INDEX RANGE SCAN          | FK_SALE_ORDER__ITEM_H_ID |     3 |       |     2   (0)|
00:00:01 |
|* 10 |       TABLE ACCESS BY INDEX ROWID | MED_OUTER_ORDER_ITEM     |     1 |    63 |     3   (0)|
00:00:01 |
|* 11 |        INDEX RANGE SCAN           | I_MED_SRC_ORDER_ITEM_ID  |     1 |       |     2   (0)|
00:00:01 |
|* 12 |      INDEX UNIQUE SCAN            | I_ID                     |     1 |       |     1   (0)|
00:00:01 |
|* 13 |     TABLE ACCESS BY INDEX ROWID   | MED_OUTER_ORDER          |     1 |    61 |     2   (0)|
00:00:01 |

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(SYSDATE@!>=SYSDATE@!-:SYS_B_5/:SYS_B_6)
   7 - filter("B"."ORGANIZATION_ID"=:1 AND TO_NUMBER("B"."PLATFORM_ID")=:SYS_B_4 AND
              "B"."DR"=:SYS_B_1 AND "B"."TS"<=SYSDATE@! AND "B"."TS">=SYSDATE@!-:SYS_B_5/:SYS_B_6)
   8 - filter("A"."SRC_ROWID" IS NOT NULL AND "A"."DR"=:SYS_B_0)
   9 - access("A"."SALEORDER_ID"="B"."ID")

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
  10 - filter("C"."DR"=:SYS_B_2)
  11 - access("A"."SRC_ROWID"="C"."SRC_ORDER_ITEM_ID")
  12 - access("C"."OUTER_ORDER_ID"="D"."ID")
  13 - filter("D"."DR"=:SYS_B_3 AND ("B"."CUSTOMER_ID"<>"D"."CUSTOMER_ID" OR
              "A"."OUTER_ORDER_ID"<>"D"."ID"))

2- Using New Indices
--------------------
Plan hash value: 4060887534

----------------------------------------------------------------------------------------------------

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
----------
| Id  | Operation                         | Name                     | Rows  | Bytes | Cost (%CPU)|
Time     |
----------------------------------------------------------------------------------------------------
----------
|   0 | SELECT STATEMENT                  |                          |     1 |   328 |    15   (7)|
00:00:01 |
|   1 |  HASH UNIQUE                      |                          |     1 |   328 |    15   (7)|
00:00:01 |
|*  2 |   FILTER                          |                          |       |       |            |
         |

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
|   3 |    NESTED LOOPS                   |                          |     1 |   328 |    14   (0)|
00:00:01 |
|   4 |     NESTED LOOPS                  |                          |     1 |   328 |    14   (0)|
00:00:01 |
|   5 |      NESTED LOOPS                 |                          |     1 |   267 |    12   (0)|
00:00:01 |
|   6 |       NESTED LOOPS                |                          |     1 |   204 |     9   (0)|
00:00:01 |
|   7 |        TABLE ACCESS BY INDEX ROWID| MED_SALE_ORDER           |     1 |   117 |     5   (0)|
00:00:01 |
|*  8 |         INDEX RANGE SCAN          | IDX$$_17D630001          |     1 |       |     4   (0)|

DBMS_SQLTUNE.REPORT_TUNING_TASK('TASK_97635')
----------------------------------------------------------------------------------------------------
00:00:01 |
|*  9 |        TABLE ACCESS BY INDEX ROWID| MED_SALE_ORDER_ITEM      |     2 |   174 |     4   (0)|
00:00:01 |
|* 10 |         INDEX RANGE SCAN

从优化输出报告中看出,需要创建索引:
create index OCC_B2B.IDX$$_17D630001 on OCC_B2B.MED_SALE_ORDER(TO_NUMBER(“PLATFORM_ID”),“ORGANIZATION_ID”,“DR”,“TS”
);

创建索引后新给的执行计划规避了全表扫描,性能也有极大的提升
在这里插入图片描述
在这里插入图片描述
将该优化建议提交给业务部门,让其在开发测试环境先做充分测试,若切实有效再上生产

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SFM过程(一)

以图像为基础的三维重建过程SFM基本如下图所示&#xff1a; 以SfM-Toy-Library代码为例&#xff0c;如下&#xff1a; ErrorCode SfM::runSfM() {if (mImages.size() < 0) {cerr << "No images to work on." << endl;return ErrorCode::ERROR;}//in…

Java-网络原理

目录 一、网络互连 局域网LAN 广域网WAN 二、网络通信基础 IP地址 端口号 认识协议 三、五元组 四、协议分层 五、OSI七层模型 六、TCP/IP五层&#xff08;或四层&#xff09;模型 网络分层对应 七、封装和分用 一、网络互连 随着时代的发展&#xff0c;越来越需要计…

Smartbi电子表格故事之用数据进行销售问题分析

天津小麦商贸有限公司&#xff08;X&M&#xff09;成立于2012年11月&#xff0c;主营业务是商贸流通业&#xff0c;主要是日用商品的批发销售。 2012年前&#xff0c;公司创始人&#xff08;总经理和销售总监&#xff09;一直从事外贸的生意&#xff0c;自从2008年金融危机…

java 课程信息管理系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 课程信息管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使…

Scrum的执行过程及产品Backlog梳理的目的、时间、内容

Scrum的迭代运行过程 产品Backlog梳理 目的&#xff1a; •对下个Sprint的需求进行需求细节梳理和精化&#xff0c;识别技术风险和依赖&#xff0c;完成估算和优先级排序。 时间&#xff1a; •本Sprint开始后第6天&#xff0c;2小时以内 。 内容&#xff1a; •理解需求…

2020下半年

2020下半年 d a b 小阶向大阶对齐 b b 平均cpi: MIPS: d c 公加验&#xff0c;私解签 加密防止被动攻击&#xff0c;认证防止主动攻击 a 访问控制包括&#xff1a;授权&#xff0c;确定存取权限&#xff0c;实施存取权限 c a c a 先申请先得 b b 著作权包括&…

论文分享 | WSBERT:Weighted Sampling for Masked Language Modeling

本次分享阿里巴巴达摩院语音实验室、新南威尔士大学与香港科技大学&#xff08;广州&#xff09;等在ICASSP2023会议发表的论文《Weighted Sampling for Masked Language Modeling》。该论文主要提出了两种简单有效的加权采样策略&#xff0c;来缓解掩码语言模型&#xff08;ML…

七、数据仓库详细介绍(调度)

0x00 前言 在之前的文章&#xff0c;我们规划了数仓架构&#xff0c;制定了数仓规范&#xff0c;然后在架构和规范的指导下设计了存储模型、构建了 ETL 系统。 数仓模型解决了数据存储问题&#xff0c;ETL 解决了数据同步集成计算问题&#xff0c;而调度解决的是自动化问题。 …

【音视频】音视频自研对比

WVP(自研视频调度平台&#xff09;CM8播放器&#xff08;前端&#xff09;传输协议&#xff1a;websocket 编码协议&#xff1a;ts 语言&#xff1a;TS传输协议&#xff1a;websocket 编码协议&#xff1a;fmp4、mse 语言&#xff1a;JS框架&#xff1a;jessibuca 性质&#xf…

TCP和UDP

文章目录 1、常见误区2、TCP和UDP的区别和应用场景3、使用了它们的协议有哪些&#xff1f;4、总结 我之前的文章中讲解即时通讯系统中&#xff0c;就用到了可靠传输协议TCP&#xff0c;在那里面我们解决了TCP传输中的半包和黏包&#xff0c;而且还实际的讨论了用了TCP&#xff…

免费开源 | 基于SpringBoot的学生信息管理系统

一、项目简介 学生信息管理后台&#xff0c;包括学生管理、课程管理、成绩管理&#xff0c;适用于课设等&#xff0c;仅具有管理功能&#xff0c;感兴趣的伙伴可以再次完善。 二、软件架构 springboot mybatis thymeleaf 三、系统运行 注&#xff1a;mysql数据库要8.0以上…

【老王读SpringMVC-6】Controller method 的正常返回值处理

handler method 的返回值处理包含两个方面&#xff1a; 一是&#xff1a;返回值对象的处理&#xff1b; 二是&#xff1a;视图的渲染。 返回值对象的处理 通过前面的分析&#xff0c;我们知道&#xff0c; 被 RequestMapping 标记 handler method 的执行是通过调用 RequestMa…

Java的反射

1.反射的定义 Java反射是Java被视为动态&#xff08;或准动态&#xff09;语言的一个关键性质。JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&a…

react学习3 生命周期

componentDidMount()与render()一个级别的&#xff0c;在组件挂载完成之后调用 卸载组件&#xff1a;REACTDOM.unmountComponentAtNode() componentWillUnmount() 组件马上被卸载的时候 老生命周期&#xff1a; 新的生命周期&#xff1a; 废弃了&#xff08;加上Unsate_还是…

Python3安装pyhanlp最佳解决方法

1、Hanlp介绍 Hanlp是一款中文自然语言处理工具。Hanlp支持多种自然语言处理任务&#xff0c;包括分词、词性标注、命名实体识别、依存句法分析、情感分析、文本分类等。其主要优点包括&#xff1a; 高准确率&#xff1a;Hanlp采用了基于神经网络的分词方法&#xff0c;有效提…

关于字符集

字符集 编码与解码 计算机中储存的信息都是用二进制数表示的&#xff0c;而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则&#xff0c;将字符存储到计算机中&#xff0c;称为编码 。反之&#xff0c;将存储在计算机中的二进制数…

【老王读SpringMVC-7】Controller method 的异常返回值处理

通过前面分析 Controller method的执行过程&#xff0c;我们知道&#xff0c; handler method 的执行是通过调用 ServletInvocableHandlerMethod#invokeAndHandle()。 执行过程中的异常全部会往上抛出&#xff0c;然后由 DispatcherServlet 来处理。 DispatcherServlet 会调用 …

MATLAB第十章_图像处理算法

目录 图像处理算法 图像处理基础 图像处理函数 默认显示方式 添加颜色条 显示多帧图像 显示动画 三维材质图像 图像的直方图 灰度变换 均衡直方图 图像处理应用 图像增强 图像重建 图像变换 图像压缩 图像分割 图像边缘检测 图像识别 图像处理算法 图像处理…

化繁为简,在线表单工具值得一试!

在办公职场中&#xff0c;经常听到不少人抱怨&#xff1a;表单制作效率低、数据整理麻烦等&#xff0c;这个时候不少办公职员是多么希望能有一整套完善的表单制作工具来满足办公需求&#xff0c;快速提升办公协作效率。不要着急&#xff0c;如今是产业分工新时代&#xff0c;在…

Linux终端环境下的浏览器Lynx和Carbonyl 的基本使用方法

一、Carbonyl 是基于Chromium开发的运行于终端下的现代版浏览器&#xff0c;比Lynx的功能更好&#xff0c;目前尚在滚动开发过程中&#xff0c;但也基本可以用了。 1. 2安装非常简单&#xff0c;下载Binaries&#xff0c;Docker&#xff0c;nmp install, 都可以。 注意&#…