当一个SQL出现性能问题时,可以使用SQL_TRACE 或者 10046事件来跟踪SQL,通过生成的trace来了解SQL的执行过程。我们在查看一条SQL的执行计划的时候,只能看到CBO 最终告诉我们的执行计划结果,但是不知道CBO 是根据什么来做的。如果遇到了执行计划异常,可以借助Oracle 10053事件进行跟踪。10053事件是oracle提供的用于跟踪sql语句成本计算的内部事件,它能记载CBO模式下oracle优化器如何计算sql成本,生成相应的执行计划。

通过session级别跟踪:

ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';

或ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';

执行相关sql

explain plan for select count(*) from obj$;

ALTER SESSION SET EVENTS '10053 trace name context off';

对特定session启用跟踪:

通过调用 DBMS_SYSTEM. SET_EV包实现

PROCEDURE SET_EV

Argument Name Type In/Out Default?

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

SI BINARY_INTEGER IN

SE BINARY_INTEGER IN

EV BINARY_INTEGER IN

LE BINARY_INTEGER IN

NM VARCHAR2 IN

查询v$sessiowww.pizei.comn 视图获取www.rsxedu.com进程信息

SQL> select sid,serial#,username from v$session where username is not null;

SID SERIAL# USERNAME


125 25 SYS

执行跟踪

exec dbms_system.SET_EV(125,25,10053,1,'');

结束跟踪

exec dbms_system.SET_EV(125,25,10053,0,'');

查询系统对应session trace文件

select value from v$diag_info where name = 'Default Trace File';

经过开发人员确认该sql在测试库(LINUX+ 12.2.0.1 单机环境)执行只需要几秒即可(数据量相差不大)完成,其中bs_loan_card_addition、bs_loan_card、bs_loan_contract_addition三张表的数据量都在200万行左右。

获取到生产环境该sql执行计划如下:

测试环境该sql执行计划如下:

首先怀疑统计信息不准确导致CBO在页游访问BS_LOAN_CARD表的时候选择错误,本应该选择BS_LOAN_CARD_I3索引(因为CUSTOMER_NO"='1000193229’的选择性很好)而这也是开发设计这个索引的原因。但结果是选择了BS_LOAN_CARD_I0索引(对应的是BS_LOAN_CARD.LOAN_CARD_NO,该列唯一的),而过滤条件根本没有这个列,他只是作为关联条件与bs_loan_card_addition表进行连接。

因此首先检查统计信息,意外发现BS_LOAN_CARD.LOAN_CARD_NO,列上居然存在一个HYBIRD类型的直方图,理论上来说该值的唯一性非常好,不应该收集直方图,因此直接删除了该列上的直方图,再次检查发现执行计划仍未改变。

尝试使用10053对该SQL执行计划的产生过程进行跟踪,发现如下信息:

而且结合执行计划

这个执行计划简单理解来说就是首先对BS_LOAN_CARD_ADDITION进行全表扫描,然后在这个所得的结果集里面每一行的LOAN_CARD_NO列拿出来到BS_LOAN_CARD里面匹配,这就是第6部里面出现了一个"B"."LOAN_CARD_NO"=:B1原因,而这个就是oracle改写后的结果。而从其选择对BS_LOAN_CARD_ADDITION进行全表扫描就不可避免的导致了效率会很低。而且其后的rows 估算为2444K,这个是贴合实际的,所以之前的删除直方图不会有结果。而测试上的改写结果明显跟这个不一样,排除统计信息的影响,那么就开始怀疑cbo内部的算法选择问题,再结合那个可疑 的 “CBQT bypassed forquery block UPD$1 (#0): Disabled by parameter. ”提示,怀疑优化器参数在两个环境中有区别,

一:_optimizer_cost_based_transformation设为linear(默认值),其有如下值:

"exhaustive", "iterative","linear", "on", "off"。

本例中该参数就是默认值,该参数可控制www.meimeitu8.com是否允许CBO进行改写

二:_optimizer_squ_bottomup 参数值为true(默认值).

而生产环境中恰好相反为false,所以生产的trace中会有Disabled by parameter 字眼

_optimizer_squ_bottomup enables unnesting of subquery in a bottom-upmanner;

该参数默认为true,即开启子查询自底向上的展开功能(也就是类似unnest hint的功能),unnest称之为对子查询展开,顾名思义,就是不让子查询孤单地嵌套(nest)在里面。

如何诊断SQL数据?相关推荐

  1. 导出/导入DataPump参数TRACE - 如何诊断Oracle数据泵(文档 ID 286496.1)

    导出/导入DataPump参数TRACE - 如何诊断Oracle数据泵(文档 ID 286496.1) 1.介绍 在Oracle10g中,我们引入了新的数据库实用程序Export Data Pump ...

  2. sql数据类型转换(cast() and convent())函数)

    sql数据类型转换(cast() and convent())函数) sql数据类型转换(cast() and convent())函数) 当 Microsoft® SQL Server™ 2000 ...

  3. 现宣布Windows Azure中SQL数据同步的增强功能

    我们很高兴宣布SQL数据同步服务迎来了更新,现可以在所有Windows Azure数据中心中操作.过去的两次更新(六月.八月)除了为预览版带来一般可靠性的改进外,还带来了如下的增强功能: ·      ...

  4. 使用FoundationDB高效地将SQL数据映射到NoSQL存储系统中

    NoSQL数据库 --FoundationDB的键-值存储系统 FoundationDB是一个分布式的键-值存储系统,支持全局ACID事务操作,并且性能出众.在安装系统时,可以指定数据分发的级别.数据 ...

  5. 编程python怎么读-python怎么读sql数据?

    python中读取SQL数据的方法: python中可以使用游标cursor来读取SQL中的数据,游标cursor是由连接创建的对象,可以在游标中执行查询,并设置数据返回的格式. 当执行select语 ...

  6. python语法怎么读-python怎么读sql数据?

    python中读取SQL数据的方法: python中可以使用游标cursor来读取SQL中的数据,游标cursor是由连接创建的对象,可以在游标中执行查询,并设置数据返回的格式. 当执行select语 ...

  7. 通过日志恢复MS SQL数据案例

     [导读]本文介绍通过日志恢复MS SQL数据案例,以数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项为前提. 前提条件是数据库的故障恢复改为非简单模式,去掉自动关闭和自动收缩两个选项. ...

  8. SQL数据导入导出问题总结

    大家打开这个链接可以看到很多数据库的连接方法.http://www.connectionstrings.com/ 这些数据库之间的数据交换就是这个贴子所要总结的内容. (一)SQL Server之间 ...

  9. sql数据黑马程序员——SQL入门

    最近研究sql数据,稍微总结一下,以后继续补充: ---------------------- ASP.Net+Android+IO开辟S..Net培训.等待与您交流! --------------- ...

最新文章

  1. C# 开启及停止进程
  2. 助力企业利润快跑的下一只轮子——移动应用?【创新时代】
  3. 1,2 多维运动公式
  4. 二叉树的前序,中序,后序,层序遍历的递归和非递归实现
  5. 刚换工作,记录下心得
  6. python中浅拷贝和深拷贝分析
  7. Linux 下的tar常用命令及操作
  8. java for list i_Java中ArrayList的fori和foreach效率比较
  9. 面向对象的思想是什么?
  10. 计算机键盘输入法基础知识,教程计算机基础知识-:认识输入法
  11. 弹出无边框网页的Javscrpt代码
  12. vscode 更改中办发文_如何在Visual Studio代码或VSCode中更改集成终端
  13. c语言中取反的作用,一位取反 硬件实现_c语言按位取反什么意思
  14. 企业绩效考核管理制度
  15. 大数据技术体系(长期更新)
  16. 如何选择家庭私有云NAS方案?家庭NAS存储服务器的重要性
  17. 基于闪电连接过程优化算法的函数寻优算法
  18. 蓝桥杯嵌入式国赛模块训练之数码管
  19. 数字化为宝马带来了什么
  20. 整数的按权展开 (10 分)

热门文章

  1. 批量将一个 PPT 幻灯片文件按固定页数拆分成多个幻灯片文件
  2. 小成开发日记-----利用Python在互动吧网站自动抢票实战分析
  3. 实时操作系统和分时操作系统的区别
  4. Tuxedo-下载与安装1
  5. Mybatis的作用
  6. 递归算法与非递归算法的转化
  7. FSCapture注册码
  8. dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
  9. idea 出现中文乱码
  10. 在window下查看占用tomcat进程,杀死进程并启用tomcat