1、重现问题
当派生表中含有非确定性函数时,MySQL自动优化的派生表合并,将导致查询的结果不及预期
请看下面SQL
with a as (
select sysdate() as val
from (values row(1)) a)
select
a.val,sleep(1),a.val
from a;
with a as (
select uuid() as val
from (values row(1)) a)
select
a.val,a.val
from a;
with a as (
select rand() as val
from (values row(1)) a)
select
a.val,a.val
from a;
复制
上面的语句都将导致查询的最终结果 两个val值并不相等
如下图
按语义两个val值是应该相等的
2.解决问题
我添加hint后
with a as (
select sysdate() as val
from (values row(1)) a)
select /*+ set_var(optimizer_switch='derived_merge=off')*/
a.val,sleep(1),a.val
from a;
with a as (
select uuid() as val
from (values row(1)) a)
select /*+ set_var(optimizer_switch='derived_merge=off')*/
a.val,a.val
from a;
with a as (
select rand() as val
from (values row(1)) a)
select /*+ set_var(optimizer_switch='derived_merge=off')*/
a.val,a.val
from a;
复制
三个结果的val值均相等了。
我在8.0.13 与 8.0.32 版本上均做了验证。都有此问题存在
8.0.13不支持 vaules 这种写法。将values row(1) 替换为select 1 即可
我认为官方应该修复此bug,当派生表中有不确定函数时,即使derived_merge=on,也需要阻止派生表的合并
我给官方提了一个bug,已被官方确认。117155
最后修改时间:2025-01-16 20:46:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1218次阅读
2025-03-13 11:40:53
MySQL8.0统计信息总结
闫建(Rock Yan)
454次阅读
2025-03-17 16:04:03
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
437次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
437次阅读
2025-03-04 21:56:13
SQL优化 - explain查看SQL执行计划(一)
金同学
375次阅读
2025-03-13 16:04:22
MySQL突然崩溃?教你用gdb解剖core文件,快速锁定“元凶”!
szrsu
321次阅读
2025-03-13 00:29:43
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
308次阅读
2025-03-17 10:36:40
[MYSQL] xtrabackup备份报错Unable to obtain lock分析
大大刺猬
231次阅读
2025-02-28 16:43:00
一键装库脚本3分钟极速部署,传统耗时砍掉95%!
IT邦德
224次阅读
2025-03-10 07:58:44
MySQL8.0直方图功能简介
Rock Yan
210次阅读
2025-03-21 15:30:53