点击上方"蓝字"

关注我们,享更多干货!

SQL优化是Oracle数据库中比较难的部分,需要对Oracle数据库具备非常扎实的理论基础。但是在刚开始接触时,往往不能很好地将理论知识应用到实践,或者有了一定的思路,又不自信或不敢确定是不是正确的。那么如何入门将理论知识转化为实践经验?本文介绍一下基于ADDM与SQL tuning的SQL优化,希望入门学习者能够从中获取一定的收获。

  • 使用ADDM定位SQL
    如果你没有从AWR中定位到需要优化的SQL,可以结合ADDM查看分析。示例如下:

Finding 1: Top SQL Statements
Impact is 17.86 active sessions, 61.29% of total activity.
----------------------------------------------------------
SQL statements consuming significant database time were found. These
statements offer a good opportunity for performance improvement.Recommendation 1: SQL TuningEstimated benefit is 4.76 active sessions, 16.35% of total activity.--------------------------------------------------------------------ActionRun SQL Tuning Advisor on the SELECT statement with SQL_ID"XXXXXXXXXXX".Related ObjectSQL statement with SQL_ID XXXXXXXXXXX.RationaleThe SQL spent 99% of its database time on CPU, I/O and Cluster waits.This part of database time may be improved by the SQL Tuning Advisor.RationaleDatabase time for this SQL was divided as follows: 100% for SQLexecution, 0% for parsing, 0% for PL/SQL execution and 0% for Javaexecution.RationaleSQL statement with SQL_ID "XXXXXXXXXXX" was executed 1094801 times andhad an average elapsed time of 0.015 seconds.RationaleI/O and Cluster wait for INDEX "XXXXXX.XXXXXXXX" withobject ID 2133671 consumed 47% of the database time spent on this SQLstatement.
XXXXXXXX为出于隐私进行准换。

以上信息描述SQL_ID XXXXXXXXXXX 99%用于CPU,I/O和群集等待已执行1094801次,并且平均执行时间为0.015秒。基于xxxx索引(object ID 2133671)的I/O和群集等待占用数据库时间的47%,建议使用SQL tuning进行优化分析。

  • 使用SQL tuning进行分析

    基于快照之间sql_id优化。

--1、创建任务

set autot off
set timing off
DECLARE
my_task_name VARCHAR2(30);
BEGIN
my_task_name := dbms_sqltune.create_tuning_task(begin_snap => 22176, --开始快照号
end_snap => 22184, --结束快照号
sql_id => '2hrbkst309jyj', --sqlid
scope => 'COMPREHENSIVE', --优化范围(limited或comprehensive)
time_limit => 60, --优化过程的时间限制
task_name => 'tuning_sql_test', --优化任务名称
description => 'tuning'); --优化任务描述
DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'tuning_sql_test');
END;
/

--2、执行任务

exec dbms_sqltune.execute_tuning_task('tuning_sql_test');

--3、查询执行当前状态

SELECT task_name,status FROM USER_ADVISOR_TASKS WHERE task_name ='tuning_sql_test';

--4、 查看优化结果

set long 999999
set serveroutput on size 999999
set line 120
select DBMS_SQLTUNE.REPORT_TUNING_TASK( 'tuning_sql_test') from dual;

--5、删除已经存在的优化任务,释放资源

exec dbms_sqltune.drop_tuning_task('tuning_sql_test');

第4步中查询SQL tuning建议内容如下:

  • 绑定sql profile
    SQL tuning的第一个建议是绑定推荐的profile,使用并行。但也提示使用parallel可能带来的高资源消耗。最后部分可以看到未使用parallel与使用parallel DB time对比。

1- SQL Profile Finding (see explain plans p below)--------------------------------------------------------  A potentially better execution plan was found for this statement.Recommendation (estimated benefit: 99.13%)  ------------------------------------------  - Consider accepting the recommended SQL profile to use parallel execution    for this statement.    execute dbms_sqltune.accept_sql_profile(task_name => 'tuning_sql_test',            task_owner => 'SYS', replace => TRUE, profile_type =>            DBMS_SQLTUNE.PX_PROFILE);Executing this query parallel with DOP 128 will improve its response time  99.13% over the original plan. However, there is some cost in enabling  parallel execution. It will increase the statement's resource consumption by  an estimated 11.03% which may result in a reduction of system throughput.  Also, because these resources are consumed over a much smaller duration, the  response time of concurrent statements might be negatively impacted if  sufficient hardware capacity is not available.The following data shows some sampled statistics for this SQL from the past  week and projected weekly values when parallel execution is enabled.Past week sampled statistics for this SQL                                 -----------------------------------------  Number of executions                                                2648  Percent of total activity                                           1.79  Percent of samples with #Active Sessions > 2*CPU                       0  Weekly DB time (in sec)                                        483633.69Projected statistics with Parallel Execution                              --------------------------------------------  Weekly DB time (in sec)
  • 建立索引
    第二个建议是建立索引,可以看到不同的执行计划:
    Plan hash value: 612724806,现使用执行计划,Time为00:36:55;
    Plan hash value: 2621731162,使用新的索引后,Time从00:36:55提升为00:05:53;
    Plan hash value: 3522323416,使用并行后,Time从00:36:55提升为00:00:20。

2- Index Finding (see explain plans p below)--------------------------------------------------  The execution plan of this statement can be improved by creating one or more  indices.Recommendation (estimated benefit: 84.07%)  ------------------------------------------  - Consider running the Access Advisor to improve the physical schema design    or creating the recommended index.    create index XXXXX.IDX$$_5191F0001 on    XxXX.XXXXXXxx(SUBSTR("ESN",-1),"STAT");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    will allow to get comprehensive index recommendations which takes into    account index maintenance overhead and additional space consumption.-------------------------------------------------------------------------------EXPLAIN PLANS SECTION-------------------------------------------------------------------------------
1- Original-----------Plan hash value: 612724806
------------------------------------------------------------------------------------------------| Id  | Operation          | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT   |                           |  8052 |  2665K|   184K  (1)| 00:36:55 ||*  1 |  COUNT STOPKEY     |                           |       |       |            |          ||*  2 |   TABLE ACCESS FULL| xxxxxxxxxx                |  8052 |  2665K|   184K  (1)| 00:36:55 |------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):---------------------------------------------------1 - filter(ROWNUM<=:1)   2 - filter("STAT"='0' AND SUBSTR("ESN",-1)='6' AND "INFO_TYPE"<>'4')
2- Using New Indices--------------------Plan hash value: 2621731162
----------------------------------------------------------------------------------------------------------| Id  | Operation                    | Name                      | Rows  | Bytes | Cost (%CPU)| Time     |----------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT             |                           | 10000 |  3310K| 29383   (1)| 00:05:53 ||*  1 |  COUNT STOPKEY               |                           |       |       |            |          ||*  2 |   TABLE ACCESS BY INDEX ROWID|xxxxxxxxxxxxxxxxxxxxxxxxxxx| 50325 |    16M| 29383   (1)| 00:05:53 ||*  3 |    INDEX RANGE SCAN          | IDX$$_5191F0001           | 46977 |       |   115   (0)| 00:00:02 |----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):---------------------------------------------------1 - filter(ROWNUM<=:1)   2 - filter("INFO_TYPE"<>'4')   3 - access("DM_DATAREG_USER_INFO_ZL_T"."qsmmix_VCol_5001"='6' AND "STAT"='0')3- Using Parallel Execution---------------------------Plan hash value: 3522323416
---------------------------------------------------------------------------------------------------------------------------------| Id  | Operation              | Name                      | Rows  | Bytes | Cost (%CPU)| Time     | TQ  |IN-OUT| PQ Distrib |---------------------------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT       |                           |  8052 |  2665K|  1601   (0)| 00:00:20 |        |      |            ||*  1 |  COUNT STOPKEY         |                           |       |       |            |          |        |  |            ||   2 |   PX COORDINATOR       |                           |       |       |            |          |     |      |            ||   3 |    PX SEND QC (RANDOM) | :TQ10000                  |  8052 |  2665K|  1601   (0)| 00:00:20 |  Q1,00 | P->S | QC (RAND)  ||*  4 |     COUNT STOPKEY      |                           |       |       |     |          |  Q1,00 | PCWC |            ||   5 |      PX BLOCK ITERATOR |                           |  8052 |  2665K|  1601   (0)| 00:00:20 |  Q1,00 | PCWC |            ||*  6 |       TABLE ACCESS FULL| xxxxxxxxxxxxxxx           |  8052 |  2665K|  1601   (0)| 00:00:20 |  Q1,00 | PCWP |            |---------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):---------------------------------------------------1 - filter(ROWNUM<=:1)   4 - filter(ROWNUM<=:1)   6 - filter("STAT"='0' AND SUBSTR("ESN",-1)='6' AND "INFO_TYPE"<>'4')

通过以上信息,可以对SQL的优化方向以及优化后的带来的效益和资源有了一定的了解,并根据优化思路反推思考为什么如此做。日积月累之下,相信大家都能够对SQL优化有自己的理解。

关于作者

王茂材,云和恩墨北区交付团队技术顾问。从事Oracle DBA工作5年,维护过200+ Oracle数据库,涉及能源、医疗、体彩、银行、运营商等行业数据库的维护和操作。对Oracle数据库具备扎实的理论基础与丰富的实践经验,擅长故障处理、迁移、备份恢复、SQL优化等。

墨天轮原文链接:https://www.modb.pro/db/65575(复制到浏览器或者点击“阅读原文”立即查看)

END

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

由ACDU(中国DBA联盟)和墨天轮联合出品的全新视频节目「数据三分钟」已发布多期,快速了解数据行业动态,快关注我们的视频号看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

聊聊SQL优化的基础思路相关推荐

  1. 面试必备:聊聊sql优化的15个小技巧

    sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到. 如果某天你负责的某个线上接口,出现了性能问题,需要做优化.那么你首先想到的很有可能是优化sql语句,因为它的改造 ...

  2. 聊聊sql优化的15个小技巧

    前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到. 如果某天你负责的某个线上接口,出现了性能问题,需要做优化.那么你首先想到的很有可能是优化sql语句,因为它 ...

  3. SQL优化的基本思路

    (1)建立物化视图或尽可能减少多表查询. (2)以不相干子查询替代相干子查询. (3)只检索需要的列. (4)用带in的条件子句等价替换or子句. (5)经常提交commit,以尽早释放锁. (6)避 ...

  4. sql优化的方法及思路_合理的sql优化思路--如何缩短SQL调优时间?

    概述 当生产环境发生故障或者系统特别慢的时候,这时候你从awr报告拿到有问题的sql,但是优化的时候却优化了很久还没解决,这时候在领导或者客户面前就不太好了...那么我们怎么去缩短sql调优的时间,一 ...

  5. B+树、索引以及SQL优化

      mysql的B+树索引 查找使用了二分查找,redis 跳表也使用了二分查找法,kafka查询消息日志也使用了二分查找法,二分查找法时间复杂度O(logn);   在MySQL中,主要有四种类型的 ...

  6. SQL优化实战经典案例分析

    前言 大家好,我是黎杜,今天和大家聊聊SQL优化的场景. SQL调优这块呢,大厂面试必问的.最近金九银十嘛,所以整理了SQL的调优思路,并且附几个经典案例分析. 1.慢SQL优化思路. 慢查询日志记录 ...

  7. 聊聊数据库优化的4大手段

    mysql 优化步骤 正如上图所示,数据库优化可以从架构优化,硬件优化,DB优化,SQL优化四个维度入手. 此上而下,位置越靠前优化越明显,对数据库的性能提升越高.我们常说的SQL优化反而是对性能提高 ...

  8. 【演讲实录】RWP团队谈SQL优化

    说到SQL优化,做为读者的您,头脑中第一反应是什么?索引?Hint?分区?参数?执行计划?哈哈哈有被言中吧 ,今天我们就来分享一下,在第七届数据技术嘉年华上,来自Oracle的曲卓分享的有关SQL优化 ...

  9. SQL优化的思路及基本原则(mysql)

    SQL优化的思路:  1.优化更需要优化的sql:  2.定位优化对象的性能瓶颈:优化前需了解查询的瓶颈是IO还是CPU,可通过PROFILING很容易定位查询的瓶颈.  3.明确优化目标:  4.从 ...

最新文章

  1. Jquery DIV滚动至浏览器顶部后固定不动代码
  2. 转载:关于对REST的基本认识和理解
  3. 牛客题霸 [合并两个有序的数组] C++题解/答案
  4. cf方框透视易语言代码怎么写_易语言真的那么不入流吗?
  5. [转载] java中的经典问题:传值与传引用
  6. 深入掌握JMS(五):实战Topic
  7. 【王牌选手分享】一发问鼎!鹅厂大神上分思路,助你玩转初赛!
  8. 十大免费PHP编辑器-开发工具
  9. 我的世界 unity3d minecraft 用unity3d来制作类似我的世界的游戏 优化树和草
  10. PostgreSQL实现USERENV函数(兼容oracle)
  11. mac os 开启redis_在Mac os x 安装 Redis
  12. 微服务入门到入土(07)-分布式搜索ElasticSearch
  13. 阿里巴巴计算机招聘学历要求,阿里巴巴招程序员,到底看不看学历?
  14. 特邀嘉宾-著名主持人李艾“每一次登台都是一次成长
  15. Java入门基础.1
  16. PCB学习笔记——如何改变图纸大小
  17. 知识点滴 - 什么是当量
  18. 转大数据开发,适合什么岗位?
  19. z77用m2固态_Z77也能用M.2固态
  20. 2016校招薪资汇总

热门文章

  1. web服务器中启用作业储存_如何在Kubernetes中启用无服务器计算
  2. 加入docker管理员_如何使系统管理员和开发人员同意Docker
  3. 前端:JS/29/实例:控制div显示_滚动的图片
  4. 分布式ID | 这六种分布式ID生成方法,总有一款适合你
  5. 计算机网络实验1线缆制作,计算机网络技术实验报告1双绞线的制作
  6. pthread_exit()
  7. cmake学习笔记(2)--CMake常用的预定义变量
  8. 深度学习笔记(6) 实践层面(一)
  9. 服务器文件夹和电脑文件夹同步软件哪个好,windows文件同步备份软件-文件夹同步工具哪个好?...
  10. postgresql中装gis插件_使用PostGIS_高级扩展插件使用_开发进阶_云原生数仓 AnalyticDB PostgreSQL - 阿里云...