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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【YashanDB知识库】decode函数中的子查询被不必要地多次执行

问题现象

客户向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语句的一致读数量,进而推断性能表现。

目录
打赏
0
1
1
0
63
分享
相关文章
【YashanDB知识库】由于hist_headanalyzetimetab中analyze time导致的sql语句执行慢
【YashanDB知识库】由于hist_headanalyzetimetab中analyze time导致的sql语句执行慢
【YashanDB知识库】如何dump数据文件,转换rowid, 查询对应内容
【YashanDB知识库】如何dump数据文件,转换rowid, 查询对应内容
【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题
【YashanDB知识库】windows配置ODBC跟踪日志, 使用日志定位问题
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】yashandb执行包含带oracle dblink表的sql时性能差
【YashanDB知识库】多表更新报错 YAS-04345 multi-table update is not supported
【YashanDB知识库】多表更新报错 YAS-04345 multi-table update is not supported
|
2天前
|
SQL
【YashanDB知识库】查询YashanDB表空间使用率
【YashanDB知识库】查询YashanDB表空间使用率
【YashanDB知识库】YMP迁移oracle不兼容给用户授权高级包
【YashanDB知识库】YMP迁移oracle不兼容给用户授权高级包
|
2天前
|
SQL
【YashanDB知识库】YAS-04110 invalid variant name
【YashanDB知识库】YAS-04110 invalid variant name
【YashanDB知识库】客户端字符集与数据库字符集兼容问题
【YashanDB知识库】客户端字符集与数据库字符集兼容问题

数据库

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等