写点什么

【YashanDB 知识库】decode 函数中的子查询被不必要地多次执行

作者:YashanDB
  • 2024-09-26
    广东
  • 本文字数:551 字

    阅读完需:约 2 分钟

本文内容转自 YashanDB 官网,具体内容请见https://www.yashandb.com/newsinfo/7441387.html?templateId=1718516

问题现象

客户向 yashandb 下发的 SQL 语句执行时间超过 6 分钟仍未出结果

问题的风险及影响

SQL 语句性能慢,影响客户业务

问题影响的版本

所有的 yashandb 22.2 版本


23.2 版本没有这个问题

问题发生原因

decode 函数在执行时判断有误,即使没有匹配到这个分支,这个分支中的子查询依然会被执行

解决方法及规避方式

规避方式:将 decode 改写为 case when

问题分析和处理过程

通过分析如下 ddl 及最后 sql 语句的 data block 访问数量来判断是否有这个问题。



由于表 a 的 pctfree 设置了 99,所以每个数据块中只有一条记录。此时这个表的全表扫描会有 1000 个左右的数据块。


对于最后的查询


select decode(rn,1,(select tname from a where tid = b.rn),'abcd') from ( select rownum rn from dual connect by rownum < 5 ) b;


由于子查询 b 中有 4 条记录,分别为 1 2 3 4,decode 中只会匹配 1,所以 decode 中对 a 表的全表扫描只有一次。


所以,正常情况下,整个 select 语句会有 1000 多的一致读。


但是如果 yashandb 存在 decode 函数的执行问题,也就是异常情况,


整个 select 语句会有 4000 多的一致读。


正常情况下的截图:



异常情况下的截图:


经验总结

使用 statistics_level=all 及 autotrace 来分析 sql 语句的一致读数量,进而推断性能表现。

用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
【YashanDB知识库】decode函数中的子查询被不必要地多次执行_yashandb_YashanDB_InfoQ写作社区