当前位置: 首页 > 调优 > 正文

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

脚本的获取请关注公众号,回复脚本就可以获得方法。

在前面几天我们写了SQL优化必备脚本:Oracle获取绑定变量的字面SQL文本,其中有网友反馈在SQL中timestamp列返回空置和有两个date类型的列式,会出现将之间:1识别为绑定变量的方式。

关于timestamp返回空值,这个是由于V$SQL_BIND_CAPTURE的机制导致的,详细信息可以查考Mos:444551.1,关于SQL语句中有:1这种值时,会被识别绑定量来替代,所以此时会返回错误的结果。

现象的模拟

declare
  b1   DATE  := to_date('05/11/2025 15:19:56', 'mm/dd/yyyy hh24:mi:ss');
  b2 timestamp:=to_timestamp('05/11/2025 15:19:56', 'mm/dd/yyyy hh24:mi:ss');
begin
execute immediate q'[select count(*) from t1 where created>:2 and last_ddl_time<:1 ]' using b2,b1;
end;
/

脚本返回的结果如下:

SYS@HTZ@ARM19C> @sql_fulltext_by_sqlid.sql
Enter value for sqlid: 8xsugjwa5k75z
SYS
select count(*) from t1 where created>NULL and last_ddl_time<'05/11/2025 15:19:56'

PL/SQL procedure successfully completed.

修复的思路

timestamp按照Mos的解决方案修复即可。
关于:1这种现象采用的是识别常亮值,也就是不替换”中的任何内容即可,这个时候需要我们自己写一个函数来实现。

修复的效果

修复后的脚本执行结果如下:

SYS@HTZ@ARM19C> @sql_fulltext_by_sqlid.sql
Enter value for sqlid: 8xsugjwa5k75z
SYS
select count(*) from t1 where created>'2025-05-11 15:19:56.000000000' and last_ddl_time<'05/11/2025 15:19:56'

PL/SQL procedure successfully completed.

这个问题就修复到这个,如果大家在执行过程中,还有问题请随时在群里面反馈,我这边会及时的修复。

更多跟性能相关的脚本

Oracle DBA必备脚本:一秒就定位千行执行计划的SQL慢在哪一步
SQL优化必备脚本:Oracle获取绑定变量的字面SQL文本
Oracle DBA必备脚本:一键获取SQL性能数据,快速定位性能拐点
DBA必备脚本:一键获得SQL访问的表及对应的索引,可协助快速定位SQL性能瓶颈

——————作者介绍———————–
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)


DBA必备脚本:Oracle获取绑定变量的字面SQL文本版版本替代:等您坐沙发呢!

发表评论

gravatar

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen

快捷键:Ctrl+Enter