梆定变量的长度不一致也可能会造成硬解析
当第一次使用梆定变量为字符串类型,并且小于32bytes时,oracle捕获这个梆定变量,并改写该梆定变量的字符串长度为32Bytes。如果第二次再使用该sql和梆定变量,如果梆定变量长度超过32字节小于128字节,则oracle会自动将该梆定变量长度改为128字节,并且重新生成一个子游标和执行计划,造成相同梆定变量的sql的执行计划不能共享,需要重新生成解析树和执行计划(即是硬解析),过多的硬解析是万恶之源,会占用大量的CPU、IO和内存资源,造成系统性能瓶颈。所以使用相同SQL的相同梆定变量时,要特别注意每次该梆定变量的长度是否在符合软解析的区间长度内。
测试结果如下:
1)、创建一个10个字节可变长度的字符串变量 v:
23:24:15SYS@orcl*SQL> var v varchar2(10);
23:24:26SYS@orcl*SQL> exec :v :='abcd';
23:24:26SYS@orcl*SQL> print v;
V
----------
abcd
2)、将变量 v 梆定到 sql 的查询谓词条件值中,并执行:
23:24:27SYS@orcl*SQL> select * from tuser.testbind where test=:v;
TEST
----------
abcd
3)、查询上面执行的sql在 Library Cache (Sharedpool共享池中的库缓存)中生成游标和执行计划的 sql_id,并注意子游标号CHILD_NUMBER是0(第一个子游标,即第一个执行计划版本):
23:24:32SYS@orcl*SQL> select sql_id,sql_text,child_number from v$sql where sql_textlike 'select * from tuser.testbind where test=:v%';
SQL_ID SQL_TEXT CHILD_NUMBER
-------------------------------------------------------------------------------------- ------------------
13gr9g2810v9c select * from tuser.testbindwhere test=:v 0
4)、由于是第一次执行第2步的sql,并且梆定变量长度还没有变化,所以如下显示的梆定变量长度已更改字段(BIND_LENGTH_UPGRADEABLE)为No:
23:24:38SYS@orcl*SQL> select sql_id,child_number,BIND_LENGTH_UPGRADEABLE fromv$sql_shared_cursor
23:24:50 2 where sql_id='13gr9g2810v9c';
SQL_ID CHILD_NUMBERBIND_LENGTH_UPGRADEABLE
-------------------------------------------- ------------------------------
13gr9g2810v9c 0 N
5)、查询捕获的梆定变量信息,DATATYPE_STRING字段列自动将小于32字节的梆定变量更改为32字节:
23:25:03SYS@orcl*SQL> select position,LAST_CAPTURED,datatype_string,value_string
23:25:04 2 from v$sql_bind_capture
23:25:04 3 where sql_id='13gr9g2810v9c';
NAME POSITION LAST_CAPTURED DATATYPE_STRING VALUE_STRING
----------- -------- ----------------------------------------- -------------------------
:V 1 2017-04-14 23:24:31 VARCHAR2(32) abcd
6)、再将梆定变量 v 的长度更改为超过32字节,如下33字节:
23:25:05SYS@orcl*SQL>
23:25:09SYS@orcl*SQL> var v varchar2(33);
23:25:18SYS@orcl*SQL> exec :v :='abcd';
23:25:18SYS@orcl*SQL> print v;
V
----------
abcd
7)、再次执行以上第二步的sql:
23:25:19SYS@orcl*SQL> select * from tuser.testbind where test=:v;
TEST
----------
abcd
8)、和以上第3步对照,再次查询 Library Cache 中的 v$sql字典视图,发现生成多了一个子游标(CHILD_NUMBER=1),也就是发生硬解析,重新生成了新的执行计划:
23:25:23SYS@orcl*SQL> select sql_id,sql_text,child_number from v$sql where sql_textlike 'select * from tuser.testbind where test=:v%';
SQL_ID SQL_TEXT CHILD_NUMBER
-------------------------------------------------------------------------------------- ------------------
13gr9g2810v9c select * from tuser.testbindwhere test=:v 0
13gr9g2810v9c select * from tuser.testbindwhere test=:v 1
9)、和以上第4步对照,再次查询可以发现,oracle已经捕获到梆定变量 v 的长度相比之前发生了变化:
23:25:39SYS@orcl*SQL> select sql_id,child_number,BIND_LENGTH_UPGRADEABLE fromv$sql_shared_cursor
23:25:40 2 where sql_id='13gr9g2810v9c';
SQL_ID CHILD_NUMBERBIND_LENGTH_UPGRADEABLE
-------------------------------------------- ------------------------------
13gr9g2810v9c 0 N
13gr9g2810v9c 1 Y
10)、oracle 自动将梆定变量 v 的长度改为128字节,第二次定义时是33字节(见第6步)
23:25:40SYS@orcl*SQL> select position,LAST_CAPTURED,datatype_string,value_string
23:25:46 2 from v$sql_bind_capture
23:25:46 3 where sql_id='13gr9g2810v9c';
POSITION LAST_CAPTURED DATATYPE_STRING VALUE_STRING
------------------------------------- ------------------------------------------------------------
1 2017-04-14 23:25:23VARCHAR2(128) abcd
1 2017-04-14 23:24:31VARCHAR2(32) abcd
由此可见,虽然使用梆定变量能让相同的SQL,不同的条件值可以走上相同的执行计划,从而避免过多的硬解析,不会消耗过多的资源,但也要注意梆定变量长度的变化,否则使用了梆定变量也可能会产生硬解析,造成资源浪费。
(完)
梆定变量的长度不一致也可能会造成硬解析相关推荐
- sql like 绑定变量_码硬解析的改进方法之二使用绑定变量
绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析 绑定变量(bind variable)是指在DML语句中使用一个占位符,即使用冒号后面紧跟变量名的形式,如下 select * fro ...
- Oracle优化09-绑定变量
思维导图 系列博文 Oracle-绑定变量binding variable解读 Oracle-Soft Parse/Hard Parse/Soft Soft Parse解读 概述 绑定变量是OLTP系 ...
- 小白python笔记(七)带你搞定——变量的基本使用
小白python笔记(七)带你搞定--变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用 ...
- c语言事故,C语言梆定ActiveX事件
我的博客里写的关于C语言访问COM的一些文章帮助了一些朋友,感到非常高兴.最近有几个朋友发邮件问过我C梆定ActiveX事件的方式,解答后感觉好像也有段时间没有写文章了,所以就详细地来写一篇关于C梆定 ...
- matlab中plot同时绘制两个函数时向量长度不一致的解决办法
在同一张图上绘制函数及其导数的图形的时候遇到的问题:求导数需要diff函数,众所周知,diff函数计算的是差值,出来的向量比原向量维数少1,导致用一个plot绘制的时候会报错 matlab中绘图时遇到 ...
- Oracle-绑定变量binding variable解读
文章目录 绑定变量概述 绑定变量详解 绑定变量使用限制条件 字符级的比较 两个语句所指的对象必须完全相同 两个SQL语句中必须使用相同的名字的绑定变量(bind variables) 查询使用绑定变量 ...
- C语言中如何测量各种变量的长度
在比特学习第一天,简单了解了C语言的一些基本的概念,算是初窥门径了,虽然大一上过C语言课,但那时候上课没怎么认真听,也就会写个"Hello World",hhhhhhh,第一节课讲 ...
- C++对于文件的操作(4)——更改文件指定位置的数据(在新旧数据长度不一致的情况下)
上篇博客说到了在"新旧长度一致"的情况下如何更改文件制定位置的数据,这一篇就来说明一下如何在新旧长度不一致的情况下更改文件中某一行的数据. 具体的思路主要是:遍历行→保存行→更改指 ...
- C++获取目标变量的长度及类型转换
目录 1. 获取目标变量的长度 1.1 int, double, char 等变量数组长度的获取 1.2 字符串的长度获取 1.3 动态数组的长度获取 1.4 C++ STL容器(array,vect ...
最新文章
- 初识 ElasticSearch,一个上天下地的搜索引擎 No.158
- 四则运算c语言编程分支结构,C语言之分支结构(二)
- aop简介-基于cglib的动态
- volatile 和 sig_atomic_t
- 1443B. Saving the City
- Linux命令rm的常用用法
- [BUG]Git Sever搭建与相关错误处理
- 结对-结对编项目作业名称-最终程序
- Android 上专为视屏直播打造的轻量级弹幕库(100 多 kb)
- 【Heydrones】飞手百科第一篇:一定要看的无人机原理总结
- web前端程序员真的值这么多钱吗?
- android 如何进入安全模式,手机怎么进入安全模式
- 《黑匣子思维:我们如何更理性地犯错》ipad部分
- 【已解决】The server cannot or will not process the request due to something that is perceived to be ...
- zynq开发中的设备树
- zygote启动过程
- 利用requests库抓取猫眼电影排行
- 硕士论文免费查重网站不靠谱,最好用知网!
- M1 Mac安装PostgreSQL
- loopback interface data flow