梆定变量的长度不一致也可能会造成硬解析

Oracle正确使用绑定变量对系统性能提升探索 对于OLTP类型的应用系统而言,据库端性能的优劣对系统整体的运行有至关重要的影响,而影响SQL语句,PL/SQL代码执行效率的因素多种多样,其中一条比较重要则是对于SQL语句的硬解析数量在SQL解析中所占的比重,如果SQL硬解析所占的比重较高,将会对系统性能产生较大影响。如下是关于对Oracle中通过合理使用绑定变量带来的性能改善的一些探索 阅读详情

当第一次使用梆定变量为字符串类型,并且小于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,不同的条件值可以走上相同的执行计划,从而避免过多的硬解析,不会消耗过多的资源,但也要注意梆定变量长度的变化,否则使用了梆定变量也可能会产生硬解析,造成资源浪费。

(完)

绑定变量值长度不一致,mismatch问题 111 阅读详情

相关推荐

WinForm布局

登录模板页面UILoginForm

m0_71541781的博客 470

bind变量的长度不同导致多个chlid cursor

bind变量的长度不同导致多个chlid cursor 测试如下: SQL> create table test (a varchar2(4000)); 表已创建。 SQL> declare   2  instring varchar2(4000);   3    begin   4     for i in 1..2001 loop   5       instring

weiwang的专栏 2621

从d、q轴电流到电机性能:FOC控制中角度偏移的实战影响与调试策略

本文深入探讨了永磁同步电机FOC控制中d、q轴电流与角度偏移对电机性能的影响及调试策略。通过分析角度偏移导致的效率下降、电流异常等问题,提供了实用的四步调试法和参数优化技巧,帮助工程师有效提升电机控制精度和效率。

weixin_29264201的博客 294

Oracle绑定变量类型和长度引起的执行计划变化

在Oracle数据库中执行SQL语句,当客户端发出一条语句交付到ORACLE,会进行以下几个步骤: 1、语法检查(syntax check)检查此sql的拼写是否语法。2、语义检查(semantic check)诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。3、对sql语句进行解析(prase)利用内部算法对sql进行解析,生成解析树(parse tree)及执行计...

weixin_30699955的博客 654

优快云积分获取与管理全攻略

技术社区积分系统是知识共享生态的核心激励机制,通过量化用户贡献实现资源交换。其底层逻辑遵循Web2.0时代的UGC经济模型,用户通过内容创作、社区互动等行为积累虚拟资产。在开发者社区场景中,积分体系能有效促进技术文档、工具源码等资源的流通,优快云作为国内头部平台,其积分规则具有典型参考价值。掌握签到策略、内容互动技巧和资源上传规范等实操方法,可系统性提升积分获取效率。2023年新规强化了连续签到奖励和互动质量检测机制,结合GitHub等开源平台资源互补,能构建更高效的技术资源获取路径。

weixin_34233974的博客 218

手把手调试Android 14 ShellTransitions:用Log追踪ActiveTransition与Handler匹配过程

本文详细介绍了在Android 14中调试ShellTransitions机制的方法,重点通过Log追踪ActiveTransition与Handler的匹配过程。文章提供了关键日志点植入策略、Handler匹配机制解析及实战调试案例,帮助开发者解决窗口转场动画中的卡顿和错乱问题,提升系统动画性能。

weixin_42652674的博客 429

过高SQL子游标案例分析

问题描述: 最近遇见一个问题关于单个SQL拥有过高子游标。当时接到oracle数据库报警,有200多会话一直处在active状态,insert语句非常缓慢。主机CPU达到了97%。 问题分析: ...

cqr0591的博客 801

ESP32-S3打造离线语音助手:从零部署自定义唤醒词与本地大模型推理【实战指南】

本文详细介绍了如何利用ESP32-S3芯片打造离线语音助手,包括自定义唤醒词训练与本地大模型推理的实战指南。通过硬件架构解析、音频处理优化及性能调优技巧,实现低延迟、高隐私保护的语音交互方案,特别适合智能家居和物联网应用。

weixin_30296405的博客 604

[20160224]绑定变量的分配长度.txt

[20160224]绑定变量的分配长度.txt --如果绑定变量中字符串分配占用空间的长度变化,oracle会建立子光标。 --昨天被别人问一个问题,通过例子来说明: 1.环境: SCOTT@book> @ &...

217

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南

本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。

weixin_29093017的博客 481

18. 从 SAP Fiori Elements List Report 中的图片显示,谈谈背后的 XML Template 设计机制

至此,Fiori Elements List Report 这个模版里,图片显示的原理,笔者已经从开发人员层面需要定义的注解,和 Fiori Elements 框架层面如何解析这些注解,这两方面做了深入介绍。从本文开始,我们从 Fiori Elements 预制的标准 XML Template 模版的设计,来介绍我们在最终 Fiori Elements 页面看到的产品图标,是如何渲染出来的。但是,List Report 里产品的图标显示,到底是上面这些 XML 文件里的哪一个里定义的呢?

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 607

Oracle绑定变量分级(Bind Graduation)

Oracle绑定变量分级(Bind Graduation) 绑定变量分级(Bind Graduation)是指Oracle在PL/SQL代码中会根据文本型绑定变量的定义长度而将这些文...

coco3600的博客 349

携程机票数据爬取实战:使用 Python 获取携程网机票信息

通过本篇博客,我们详细介绍了如何使用 Python 爬取携程网的机票信息,涉及了静态网页爬取(使用 Requests 和 BeautifulSoup)和动态网页爬取(使用 Selenium)两种方法。通过获取的数据,我们不仅能够进行票价分析,还可以构建更为复杂的预测模型或趋势分析工具。爬虫技术不仅能够帮助我们收集有价值的数据,还能够为商业决策提供数据支持。在实际应用中,我们可以结合更多的分析方法,如自然语言处理、图像处理等,进一步提升数据的价值。

2201_76125261的博客 1657

【转载】Oracle绑定变量、硬解析、软解析

转载地址:http://cjjwzs.iteye.com/blog/1010263 Oracle在执行SQL语句时,普遍存在以下几个步骤: 当SQL语句首次执行,Oracle将确认该句语句的语法是否正确(语法解析Syntax parse)并进一步确认语句相关表和列的存在性等因素(语义解析semantic parse)以及优化器决定执行计划等步骤。整个过程称之为硬解析,硬解析消耗大量的CPU...

decision06的专栏 591

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Oracle硬解析与软解析:码硬解析的改进方法之二使用绑定变量

绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析 绑定变量(bind variable)是指在DML语句中使用一个占位符,即使用冒号后面紧跟变量名的形式,如下 select * from em...

380

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Oracle绑定变量、硬解析、软解析、执行计划关系

Oracle在执行SQL语句时,普遍存在以下几个步骤: 当SQL语句首次执行,Oracle将确认该句语句的语法是否正确(语法解析Syntax parse)并进一步确认语句相关表和列的存在性等因素(语义解析semantic parse)以及优化器决定执行计划等步骤。整个过程称之为硬解析,硬解析消耗大量的CPU时间和系统资源。硬解析过多会有效降低系统性能。 若之前已进行过硬解析,...

sstevencao的专栏 687

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

sql like 绑定变量_码硬解析的改进方法之二使用绑定变量

绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析 绑定变量(bind variable)是指在DML语句中使用一个占位符,即使用冒号后面紧跟变量名的形式,如下 select * from emp where empno=7788 --未使用绑定变量 select * from emp where empono=:eno...

weixin_39796238的博客 257

mysql硬解析_Oracle硬解析与软解析:码硬解析的改进方法之二使用绑定变量

绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析绑定变量(bind variable)是指在DML语句中使用一个占位符,即使用冒号后面紧跟变量名的形式,如下select * from emp where empno=7788 --未使用绑定变量select * from emp where empono=:eno --:eno即为绑定变量在第二个查询中,变量值在查询执行时被提供。该...

weixin_36184835的博客 239

SQL -- 判断测试SQL为软/硬解析(Oracle)

前言:本人能力有限,本文部分参考。 执行SQL是软解析、硬解析? 理论知识:(参考博客leshami) Oracle 硬解析与软解析是我们经常遇到的问题,什么情况会产生硬解析,什么情况产生软解析,又当如何避免硬解析?下面的描述将给出软硬解析的产生,以及硬解析的弊端和如何避免硬解析的产生。(其实理论说起来不难,难的是开发让你证明。头皮发麻) 一、SQL语句的执行过程 当发布一...

heguanghuicn的博客 1311

查看mysql硬解析_几种常见重新硬解析的原因

经常有客户提说某个SQL的执行计划变差了,导致出现了性能问题,进而就问为啥解析出了新的执行计划。首先可以肯定突然出现了新的执行计划表明sql进行了重新硬解析(注意重新硬解析不一定产生新的执行计划),那么为啥好好的sql需要重新硬解析呢?今天我们就列举几种常见的原因:1.自动收集统计信息为了保证sql的最佳执行性能,oracle需要找到一个最优的执行计划,基于CBO模式的优化器必须要知道最新的统计信...

weixin_42519772的博客 260

mysql 硬解析 软解析_3.硬解析,软解析,软软解析

v$sql ->存子游标信息(每个子游标对应一次硬解析),关键信息是执行环境和执行计划v$sqlarea ->存父游标信息,对应sql语句的文本在v$sql中一个sql_id会存在多条语句,实际上v$sql中sql_id和child_number共同确定一个唯一的sql,原因是一个sql_id对应多个子游标。不同schema下相同sql,sql_id相同,单查询的对象不是同一用户由于统...

weixin_39582480的博客 399

几种常见重新硬解析的原因

经常有客户提说某个SQL的执行计划变差了,导致出现了性能问题,进而就问为啥解析出了新的执行计划。首先可以肯定突然出现了新的执行计划表明sql进行了重新硬解析(注意重新硬解析不一定产生新的执行计划),那么为啥好好的sql需要重新硬解析呢?今天我们就列举几种常见的原因: 1.自动收集统计信息为了保证sql的最佳执行性能,oracle需要找到一个最优的执行计划,基于CBO模式的优化器必须要知道最新的统计...

biyunao2658的博客 903

oracle sql 子游标_Oracle SQL 硬解析和子游标

阅读导航Oracle SQL 硬解析和子游标硬解析和产生子游标的原因如何避免Oracle SQL 硬解析和子游标What reasons will be happening sql hard parse and generating new child cursors在一个繁忙的系统中,发现一个复杂且非常长的查询,产生40多个子游标和大量的硬解析,占用很多的内存、CPU资源;SQL> @sq...

weixin_39682301的博客 270

Oracle SQL 硬解析和子游标

Oracle SQL 硬解析和子游标 What reasons will be happening sql hard parse and generating new child cursors 在一个繁忙的系统中,发现一个复杂且非常长的查询,产生40多个子游标和大量的硬解析,占用很多的内存、CPU资源; SQL> @sql 3168229204 Show SQL text, ch

oggyyq42448的博客 456

Oracle绑定变量分级-实测

在oracle 中,对于一个提交的sql语句,存在两种可选的解析过程, 一种叫做硬解析,一种叫做软解析. 一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决。这是因为门闩是为了顺序访问以及修改一些内存区域而...

dustzhu的博客 503
上一篇: MySQL服务无法启动,Innodb初始化失败处理。
下一篇: MySQL --init-file 参数可以让 memory 表的固定数据永不丢失
Samdy_Chan
博客等级 码龄18年 157粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值