首页 > 其他分享 >一个执行计划异常变更的案例 - 外传之查看绑定变量值的几种方法

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

时间:2023-06-19 13:01:49浏览次数:48  
标签:外传 SQL bind 变量值 绑定 sql 执行


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

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

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

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

方法一:10046

使用level=4的10046事件,查看生成的trace文件,

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


可以看出绑定变量值是’Z’。

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

方法二:v$sql_bind_capture

首先找出SQL对应的sql_id,

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


从v$sql_bind_capture可以看出两个绑定变量占位符以及对应的值,

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


这里有一点值得注意的就是,DATATYPE_STRING列的描述是“绑定变量数据类型的文本表示”,开始我认为就是绑定变量字段的数据类型,但实际看来不是,DATATYPE_STRING列只是来告诉你绑定变量列是字符型,还是数值型。

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


我们此时换一下绑定变量值,发现vsql_bind_capture信息未变,dbsnake的书中曾说过当SQL执行硬解析时绑定变量值被捕获,并可从视图v$sql_bind_capture中查询。

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


对于执行软解析/软软解析的SQL,默认情况下间隔15分钟才能被捕获,为了避免频繁捕获绑定变量值带来的系统性能开销,而且从常理上认为,既然使用了绑定变量,最佳方式就是值分布均匀,只需要SQL执行第一次硬解析时窥探一下,后续执行的SQL执行计划应该比较稳定,因此只要能比较实时地查看第一次绑定变量值即可。间隔15分钟受隐藏参数_cursor_bind_capture_interval控制,默认值是900s,15分钟。

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


我们尝试将捕获绑定变量的间隔时间调短,该参数不支持session级别修改,

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


执行alter system级别操作,

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


等大约一分钟,此时可以从v$sql_bind_capture查询刚使用的绑定变量值,

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

方法三:AWR信息

(1) DBA_HIST_SQLBIND视图包含了v$sql_bind_capture的快照。

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


因此对应的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参数,

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


默认值是

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


含义是,

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


此时重新执行SQL,默认AWR会一小时采集一次,此时可以手工采集AWR快照,

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


此时再次查询DBA_HIST_SQLBIND,

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


再次查询DBA_HIST_SQLSTAT,

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

方法四:EM?

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

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

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

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


标签:外传,SQL,bind,变量值,绑定,sql,执行
From: https://blog.51cto.com/u_13950417/6512500

相关文章

  • 超多绑定变量导致异常的一个案例
    最近生产上出现一个问题,某个应用单个SQL中绑定变量个数超过了65535个,导致数据库出现了异常终止的现象。通过trace,看到很多这样的信息(为了脱敏,此处引用MOS的例子),导致问题的SQL诸如这种,BEGINUPDATETESTSETC1=:1,C2=:2,C3=:3,......
  • 在KVM中将USB设备绑定到虚拟机,device地址会变化的时候也可以使用该办法
    1.检查主机上的USB设备。在主机上运行`lsusb`命令,查看连接的USB设备及其总线地址,例如:$lsusbBus002Device001:ID1d6b:0003LinuxFoundation3.0roothubBus001Device003:ID046d:c52bLogitech,Inc.UnifyingReceiverBus001Device002:ID8087:0024I......
  • Vue项目入门实战(07)-想让你的Vue页面更炫酷?来学习样式绑定吧
    1class的对象绑定1.1需求现在要实现点击div区域里的helloworld文本时,文本变成红色。1.2实现<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Vue中的样式绑定</title><scriptsrc="../vue.js&q......
  • wpf combobox 绑定枚举
    1、先定义个枚举转换类///<summary>///枚举转换///</summary>publicclassEnumerationExtension:MarkupExtension{privateType_enumType;///<summary>///枚举转换///</summary>///<param......
  • WPF 绑定command在触屏上操作时,即使点中button也可能不触发
    现象:WPF程序绑定的command在触摸屏上,点击button后,button绑定的事件偶尔会出现不响应的情况。确认100%点击有效,不会出现误触的情况。但是用鼠标点击,绝对不会出现这种现象。 原因:在非触屏环境,bingdingcommand是由点击来触发,即是使用鼠标等输入设备来执行点击触发command,调用......
  • vue 的双向绑定原理(vue 的响应式原理)流程
    一、原理 二、流程第一步,“数据劫持”vue2.x用Object.defineProperty()方法来实现数据劫持,为每个属性分配一个订阅者集合的管理数组depvue3.x用ES6的Proxy构造函数来实现数据劫持。第二步,“添加订阅者”在编译的时候在该属性的数组dep中添加订阅者添加方......
  • C++ 虚函数与动态绑定
    多态与动态绑定为了实现C++的多态,C++使用了动态绑定技术,该技术的核心是虚函数表(简称虚表)。类的虚函数表每个包含了虚函数的类都包含一个虚表,一个子类如果继承了包含虚函数的父类,那么这个类也拥有自己的虚表,例如classA{public:virtualvoidvfunc1();virtualv......
  • MVVM开发模式+双向数据绑定及扩展
    一、MVVM开发模式(1)前端的视图层概念=》由MVC演化(2)M:model【模型层】:渲染页面所以来的数据源(通过ajax从服务端获取的数据)  V:view【视图层】:将数据模型转换成UI展示给用户  VM:【视图模型层】:当监听到DOM变化时,会自动地更新数据源里面所依赖的数据......
  • 6. Vue.js 表单输入绑定 #yyds干货盘点#【yyds干货盘点】
    学习目录:Vue.js简介Vue.js实例与数据绑定Vue.js计算属性和侦听器Vue.js条件渲染和列表渲染Vue.js事件处理Vue.js表单输入绑定Vue.js组件基础Vue.js组件通信Vue.js插槽Vue.js动态组件和异步组件Vue.js自定义指令Vue.js过渡和动画Vue.js混入Vue.js自定义事件和v-model......
  • 45 最佳实践-性能最佳实践-kworker隔离绑定
    45最佳实践-性能最佳实践-kworker隔离绑定45.1概述kworker是Linux内核实现的per-CPU线程,用来执行系统中的workqueue请求。kworker线程会和vCPU线程争抢物理核资源,导致虚拟化业务性能抖动。为了使虚拟机能够稳定的运行,减少kworker线程对虚拟机的干扰,可以将主机上的kworker线程绑......