优化器生成正确执行计划的前提条件是要有正确的统计信息,不准确的统计信息往往会导致错误的执行计划。当通过SQL和基数推断出的执行计划和实际执行计划不同时,就可以借助10053事件。10053事件是用来诊断优化器如何估算成本和选择执行计划的,用它产生的trace文件提供了Oracle如何选择执行计划,为什么会得到这样的执行计划信息。和10046事件类似,它主要用于特殊情况下的分析和诊断。

1、测试环境:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

2、建立测试对象
SQL> create table tabtemp as select * from dba_objects where object_id is not null;
Table created.

SQL> select count(object_id) from tabtemp;
COUNT(OBJECT_ID)
----------------
           72764

测试表object_id列的数值分布:
SQL> select count(distinct object_id) from tabtemp;
COUNT(DISTINCTOBJECT_ID)
------------------------
                   72764
建立索引:
SQL> create index idx_tabtemp_id on tabtemp(object_id);

3、生成10053事件
统计表及索引信息:
SQL> exec dbms_stats.gather_table_stats(user,'TABTEMP',cascade=>true);

查看执行计划:
SQL> alter session set tracefile_identifier='plan';
SQL> set autotrace trace exp;
SQL> alter session set events '10053 trace name context forever,level 1';

SQL> select * from tabtemp where object_id=3;
Execution Plan
----------------------------------------------------------
Plan hash value: 2221486709
--------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    97 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TABTEMP        |     1 |    97 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TABTEMP_ID |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID"=3)
由执行计划可知,查询走索引,这是非常高效的查询方式。

更新测试表,将object_id列数值全部设置为3:
SQL> update tabtemp set object_id=3 where object_id!=3;
72763 rows updated.

SQL> commit;
SQL> select count(distinct object_id) from tabtemp;
COUNT(DISTINCTOBJECT_ID)
------------------------
                       1

不收集统计数据,查看执行计划:
SQL> set autotrace trace exp;
SQL> select * from tabtemp where object_id=3;
Execution Plan
----------------------------------------------------------
Plan hash value: 2221486709
-------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    97 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| TABTEMP        |     1 |    97 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TABTEMP_ID |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("OBJECT_ID"=3)
由输出结果可知,本次查询沿用原来的执行计划,是错误的执行计划。

重新对更新后的测试对象进行数据分析:
SQL> set autotrace off;
SQL> exec dbms_stats.gather_table_stats(user,'TABTEMP',cascade=>true);

查看收集统计数据后的执行计划:
SQL> set autotrace trace exp;
SQL> select * from tabtemp where object_id=3;
Execution Plan
----------------------------------------------------------
Plan hash value: 3955501171
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         | 72757 |  6749K|   293   (2)| 00:00:04 |
|*  1 |  TABLE ACCESS FULL| TABTEMP | 72757 |  6749K|   293   (2)| 00:00:04 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("OBJECT_ID"=3)

由输出可知,本次查询使用了正确的执行计划。所以,要注意在实际生产环境中对表、索引等进行及时有效的统计数据收集工作,避免因此带来性能问题。

SQL> alter session set events '10053 trace name context off';
SQL> select value from v$diag_info where name='Default Trace File';
VALUE
------------------------------------------------------------------------------
c:\app\administrator\diag\rdbms\orcl11g\orcl11g\trace\orcl11g_ora_5952_plan.trc

4、分析10053事件trace文件中CBO出错的位置
#more  orcl11g_ora_5952_plan.trc
在前面模拟中有如下操作:
SQL> update tabtemp set object_id=3 where object_id!=3;
72763 rows updated.
SQL> commit;
SQL> select count(distinct object_id) from tabtemp;
COUNT(DISTINCTOBJECT_ID)
------------------------
                       1
SQL> select * from tabtemp where object_id=3;  此处没有重新进行统计信息收集,直接发起查询。

查看10053trace文件中相对应的内容:

***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
Table: TABTEMP  Alias: TABTEMP
#Rows: 72764  #Blks:  1062  AvgRowLen:  97.00
Index Stats::
Index: IDX_TABTEMP_ID  Col#: 4
LVLS: 1  #LB: 161  #DK: 72764 LB/K: 1.00  DB/K: 1.00  CLUF: 1102.00
Access path analysis for TABTEMP
***************************************
SINGLE TABLE ACCESS PATH
Single Table Cardinality Estimation for TABTEMP[TABTEMP]
Table: TABTEMP  Alias: TABTEMP
Card: Original: 72764.000000  Rounded: 1  Computed: 1.00  Non Adjusted: 1.00
Access Path: TableScan
Cost:  291.18  Resp: 291.18  Degree: 0
Cost_io: 289.00  Cost_cpu: 26481829
Resp_io: 289.00  Resp_cpu: 26481829
Access Path: index (AllEqRange)
Index: IDX_TABTEMP_ID
resc_io: 2.00  resc_cpu: 15723
ix_sel: 0.000014  ix_sel_with_filters: 0.000014
Cost: 2.00  Resp: 2.00  Degree: 1
Best:: AccessPath: IndexRange
Index: IDX_TABTEMP_ID
Cost: 2.00  Degree: 1  Resp: 2.00  Card: 1.00  Bytes: 0
***************************************
如上述输出trace文件中加粗所示:
#DK: 表示索引中不同的键值数量。此处数值72764错误,在对表进行更新后,索引中只有1个key。
LB/K:表示每个键值对应多少个leaf blocks。此处数值为1错误,应为leaf blocks即#LB的数值。
DB/K:表示每个key对应多少个数据块。此处数值为1错误,应为#Blks的数值。
Rounded:表示关联后将产生多少条数据。此处数值为1错误,应该是测试表的总行数72764。
ix_sel_with_filters 是带有过滤条件的索引选择率,即过滤因子FF,ix_sel_with_filters =1/DK ,本例中DK数值为1,所以ix_sel_with_filters数值近似为1。
Card:即Cardinality,10gr2以后cardinality用rows表示,是oracle自己估算的数值。本例中应为测试表的行数。
本例中Index range scan访问方式cost计算公式为:
cost=blevel + FF*leaf_blocks + FF*clustering_factor,由于FF(ix_sel_with_filters)数值出现的巨大差异(错误的数值为0.000014,正确数值近似等于1),导致Index range scan访问方式cost数值出现严重偏差,最终生成了错误的执行计划。

转载于:https://www.cnblogs.com/zhjh256/p/10523287.html

oracle SQL性能分析之10053事件相关推荐

  1. oracle 10g 速度慢,让Oracle跑得更快—Oracle 10g性能分析与优化思路_数据库教程

    资源名称:让Oracle跑得更快-Oracle 10g性能分析与优化思路 内容简介: 在这本书里读者将会学到作者在性能优化方面的一些思路和思考,一些故障处理的方法和原则,这些东西是作者在实践中长期积累 ...

  2. 【深度长文】循序渐进解读Oracle AWR性能分析报告

    [深度长文]循序渐进解读Oracle AWR性能分析报告 原创 2016-10-19 韩锋 DBAplus社群 http://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEw ...

  3. Oracle SQL性能优化的40条军规

    Oracle SQL性能优化的40条军规 1. SQL语句执行步骤 语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 & ...

  4. 资源放送丨《Oracle存储过程性能分析案例》PPT视频

    点击上方"蓝字" 关注我们,享更多干货! 前段时间,墨天轮邀请数据库资深专家 周玉其 老师分享了<Oracle存储过程性能分析案例>,在这里我们将课件PPT和实况录像分 ...

  5. 让oracle跑得更快——oracle 10g性能分析与优化思路,[让Oracle跑得更快.Oracle.10g性能分析与优化思路]概要1.doc...

    [让Oracle跑得更快.Oracle.10g性能分析与优化思路]概要1 在线事务(OLTP) 在线分析(OLAP) 在Oracle数据库中,凡是分配了存储空间的,都称为段,所有段并不一定指的是表,也 ...

  6. 如何写出高性能的SQL语句,及如何进行SQL性能分析与调优

    1.尽量使用索引 索引是数据库中重要的存储结构,对于查询耗时影响甚大,应避免导致索引无效的sql语句 索引失效的场景: 1.缺失索引 2.where 条件中的or 3.where条件表字段使用函数 4 ...

  7. 【Mysql】SQL性能分析

    [Mysql]SQL性能分析 文章目录 [Mysql]SQL性能分析 1. SQL执行频率 2. 慢查询日志 3. profile详情 4. explain 1. SQL执行频率 在控制台中通过命令 ...

  8. MySQL 进阶 索引 -- SQL性能分析(SQL执行频率:查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次、慢查询日志、 profile详情、explain)

    文章目录 1. SQL性能分析 1.1 SQL执行频率(可以查看当前数据库SQL的访问频次) 1.2 慢查询日志(可以记录用时较长的SQL) 1.2.1 开启慢查询日志 1.2.2 慢查询日志测试 1 ...

  9. oracle 性能优化培训,ORACLE SQL性能优化(内部培训资料)

    ORACLE SQL性能优化系列 (一) 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) ...

最新文章

  1. (0098)iOS开发之应用间的分享系列(3)
  2. PHP 页面编码声明方法详解(header或meta)
  3. Linux内核开发工作方向
  4. 【Python】有效资源爬取并集
  5. 正点原子linux使用eclipse,Eclipse+GCC开发环境针对STM32F103ZE的开发模板,完美实现C++编程及JTAG调试...
  6. android content provider线程安全,Android ContentProvider的线程安全(二)
  7. Hadoop只输出Key不输出Value的小技巧‏
  8. 百词斩不复习_不背单词和百词斩哪个好?
  9. 使用Node.js爬取双色球十六年来所有中奖号码
  10. c语言51单片机调节led亮度,51单片机中用PWM控制LED亮度调节
  11. 一分钟教会你黑白图片如何上色
  12. 2021年大厂iOS 面试题 - 前篇
  13. OpenCV - 分水岭算法图像分割(Python实现)
  14. 【ES】ES、JS之间的关系
  15. Atitit外包优缺点 提升开发效率 外包模式 1.一般来说外包优点 1.1.更加方便快捷 时间成本降低了 1.2.会导致 经济成本高,,时间成本降低了, 2.缺点 2.1.成本高 2.2.
  16. USRP环境配置及测试
  17. 仿淘宝详情页 直接上代码
  18. solaris 10u11 安装vim7.4
  19. 申宝策略-指数呈现放量调整走势
  20. mongoDB地理位置检索

热门文章

  1. 解决WebMvcConfigurerAdapter 过时问题
  2. 休眠模式开启方法以win10系统为例
  3. XDAG: PoW + DAG
  4. mysql update 参数_mysql重要参数总结---不断更新中
  5. PHP提取富文本中的纯文字
  6. KM知识文档管理系统对企业的重要性
  7. 这才是爱情最好的样子
  8. AT32标准库(BSP)模板建立(开发笔记)
  9. uml 类图 网上书店_UML作业第三次:分析《书店图书销售管理系统》,绘制类图...
  10. Burpsuite抓包工具傻瓜式安装,安装既是中文