一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法

简介: 这篇外传之前有这么几篇文章: 《一个执行计划异常变更的案例 - 前传》 《一个执行计划异常变更的案例 - 外传之绑定变量窥探》上一篇文章介绍了绑定变量以及11g之前绑定变量窥探的影响,这篇文章会介绍几种查看绑定变量值的方法。

这篇外传之前有这么几篇文章:
《一个执行计划异常变更的案例 - 前传》
《一个执行计划异常变更的案例 - 外传之绑定变量窥探》

上一篇文章介绍了绑定变量以及11g之前绑定变量窥探的影响,这篇文章会介绍几种查看绑定变量值的方法。

上篇文章我们说了,绑定变量实际是一些占位符,可以让仅查询条件不同的SQL语句可以重用解析树和执行计划,避免硬解析。绑定变量窥探则是第一次执行SQL硬解析时,会窥探使用的绑定变量值,根据该值的分布特征,选择更合适的执行计划,副作用就是如果绑定变量列值分布不均匀,由于只有第一次硬解析才会窥探,所以可能接下来的SQL执行会选择错误的执行计划。

有时可能我们需要查看某条SQL使用了什么绑定变量值,导致执行计划未用我们认为最佳的一种。

方法一:10046
使用level=4的10046事件,查看生成的trace文件,
这里写图片描述
可以看出绑定变量值是’Z’。
这里写图片描述

方法二:v$sql_bind_capture
首先找出SQL对应的sql_id,
这里写图片描述
从v$sql_bind_capture可以看出两个绑定变量占位符以及对应的值,
这里写图片描述
这里有一点值得注意的就是,DATATYPE_STRING列的描述是“绑定变量数据类型的文本表示”,开始我认为就是绑定变量字段的数据类型,但实际看来不是,DATATYPE_STRING列只是来告诉你绑定变量列是字符型,还是数值型。
这里写图片描述
我们此时换一下绑定变量值,发现vsql_bind_capture信息未变,dbsnake的书中曾说过当SQL执行硬解析时绑定变量值被捕获,并可从视图v$sql_bind_capture中查询。
这里写图片描述
对于执行软解析/软软解析的SQL,默认情况下间隔15分钟才能被捕获,为了避免频繁捕获绑定变量值带来的系统性能开销,而且从常理上认为,既然使用了绑定变量,最佳方式就是值分布均匀,只需要SQL执行第一次硬解析时窥探一下,后续执行的SQL执行计划应该比较稳定,因此只要能比较实时地查看第一次绑定变量值即可。间隔15分钟受隐藏参数_cursor_bind_capture_interval控制,默认值是900s,15分钟。
这里写图片描述
我们尝试将捕获绑定变量的间隔时间调短,该参数不支持session级别修改,
这里写图片描述
执行alter system级别操作,
这里写图片描述
等大约一分钟,此时可以从v$sql_bind_capture查询刚使用的绑定变量值,
这里写图片描述

方法三:AWR信息
(1) DBA_HIST_SQLBIND视图包含了v$sql_bind_capture的快照。
这里写图片描述
因此对应的SQL语句,和v$sql_bind_capture很像,

select name,datatype_string,value_string,datatype from DBA_HIST_SQLBIND where sql_id='...' 

(2) 另一个视图,DBA_HIST_SQLSTAT记录了SQL统计信息的历史信息,他是基于一些标准,捕获来自于V$SQL的统计信息。可以使用如下SQL,

select
snap_id,
dbms_sqltune.extract_bind(bind_data,1).value_string bind1,
dbms_sqltune.extract_bind(bind_data,2).value_string bind2,
dbms_sqltune.extract_bind(bind_data,3).value_string bind3
from dba_hist_sqlstat
where sql_id = '...'
order by snap_id;

其中dbms_sqltune.extract_bind(bind_data,1).value_string取决于SQL中绑定变量的数量。

第一次执行这两条SQL时,并未有任何结果返回,我猜测可能是这条SQL不符合AWR采集的标准。从MOS中查到这篇文章:《How to Control the Set of Top SQLs Captured During AWR Snapshot Generation (文档 ID 554831.1)》,用其中的方法修改下AWR采集topnsql参数,
这里写图片描述
默认值是
这里写图片描述
含义是,
这里写图片描述
此时重新执行SQL,默认AWR会一小时采集一次,此时可以手工采集AWR快照,
这里写图片描述
此时再次查询DBA_HIST_SQLBIND,
这里写图片描述
再次查询DBA_HIST_SQLSTAT,
这里写图片描述

方法四:EM?
本以为任何可以使用SQL执行,都可以从EM中找到相应的界面,但未找出绑定变量值可以检索的地方,若是有朋友知道,可以告诉我们。
这里写图片描述

这里写图片描述

总结
绑定变量值可以使用很多方法获取,这里只是列举了三种最常见的方法,我从网上看到有朋友还有用wrh sqlstatv sql等视图查询的例子,没有深究,我觉得碰见问题时,可以快速使用一些常用的方法解决问题就可以了,当然时间充裕的话,建议还是多从原理层了解一些,做到触类旁通则最好。

目录
相关文章
|
运维 持续交付 网络安全
|
数据可视化 安全 项目管理
低代码开发的优缺点是什么?
【8月更文挑战第4天】低代码开发的优缺点是什么?
516 5
|
算法
如何准备阿里技术面试?终面官现身说法!
7月9日 19:00-21:30 阿里云开发者社区首场“Offer 5000”直播开启!15位团队技术大牛在线招人,更有《阿里云技术面试红宝书》助你拿下Offer!马上投递简历:https://developer.aliyun.com/special/offerday01
20666 0
|
Kubernetes Cloud Native 容灾
阿里云新版ACE全球通关第一人考试经历回顾
2022.3月底阿里云针对老版ACE进行了改版,针对云计算技术的发展趋势,新增了云原生等热门技术,同时新版ACE认证新增了实验和面试,全面考查考生的动手能力和理论知识结构,含金量大大提升。本人于2022.7.25号通过新版ACE实验,并于8.22号参加并通过了新版ACE第一场面试考试,有幸成为新版ACE全球通关第一人。现在本人备考学习新版ACE认证的过程记录成文,跟大家分享,期待越来越多的云计算技术爱好者学习和报考新版ACE,拿到属于自己的全球编号。
3608 19
阿里云新版ACE全球通关第一人考试经历回顾
|
数据库 NoSQL MongoDB
重磅 | 阿里云与MongoDB达成战略合作,成为全球唯一提供最新版MongoDB的云厂商
10月31日,阿里云与开源数据库软件公司MongoDB达成战略合作协议,根据协议,阿里云将成为全球唯一可提供最新的MongoDB服务的云厂商,最新版MongoDB 4.2将于11月上线。
3637 0
|
人工智能 运维 监控
独家 | 蚂蚁金服TRaaS技术风险防控平台解密
蚂蚁金服技术风险防控平台TRaaS的前世今生。
6038 0
|
人工智能 运维 Kubernetes
阿里云认证&未来网络学院ACE公开课——30分钟掌握ACE考试通关攻略
新版ACE通关攻略,这4点经验,帮你斩获高分!入群即赠价值3000元ACP全套线上课+资料包!公开课钉群:44832770。
阿里云认证&未来网络学院ACE公开课——30分钟掌握ACE考试通关攻略
|
弹性计算 网络安全 数据安全/隐私保护
跨账号VPC间互访|学习笔记
快速学习跨账号VPC间互访
跨账号VPC间互访|学习笔记
|
网络安全 网络架构
一文带大家,彻底了解【NAT技术-网络地址转换】
一文带大家,彻底了解【NAT技术-网络地址转换】
1329 0
一文带大家,彻底了解【NAT技术-网络地址转换】
|
JavaScript 前端开发 Java
playwright录制脚本-web自动化测试
在编写 web 自动化测试用例时,代码编写的速度是否快,会影响框架的使用体验。现在很多的框架都会提供一些辅助功能,帮助我们更快的去编写自动化测试代码,而录制功能是几乎所有的web自动化工具都会带的功能。 在实际操作过程中,有 2 个问题影响代码编写速度。第一个问题,每次操作前都需要先定位元素,需要编写元素定位选择器,这需要我们频繁查看网页的源代码,如果元素选择器编写不够规范,会引发测试用例失败。第二个问题,每一步操作都要调用对应的api函数,如果这些函数使用不规范,也会影响编程的速度和用例通过。
933 0