GreatSQL社区

搜索

chongzh

MySQL[bug] 子查询含用户变量,派生条件下推将导致不同版本的查询结果不一致 ...

热度 1chongzh 已有 896 次阅读2024-3-26 13:36 |个人分类:MySQL Bug|系统分类:故障排错

问题描述

 相同SQL在不同MySQL版本中查询相同数据的查询结果不一致,高版本8.0.32查询结果符合预期(查询有结果),低版本8.0.25查询结果不符合预期(查询无结果)。

 分析:业务SQL包含用户自定义变量赋值,SQL在不同版本的执行计划不一样,推测可能受optimizer_switch的影响。

BUG定位

参考:https://bugs.mysql.com/bug.php?id=104918

简单理解: 子查询中有用户变量的情况,派生条件下推后,有时会影响子查询中用户变量的求值分配结果。

bug修复

 bug 104918,在 MySQL 8.0.28修复。

参考:

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-28.html

http://dev.mysql.com/doc/refman/8.0/en/derived-condition-pushdown-optimization.html

bug规避

 对于低于MySQL 8.0.28的版本,可以在特定sql中添加  /*+ NO_DERIVED_CONDITION_PUSHDOWN() */  ,在特定的查询中禁用derived_condition_pushdown优化。

 全局地关闭 derived_condition_pushdown 可以在配置文件中添加  optimizer_switch='derived_condition_pushdown=off'

 问题sql中添加  /*+ NO_DERIVED_CONDITION_PUSHDOWN() */  禁用derived_condition_pushdown优化后,在MySQL 8.0.25 中出现了符合预期的正确结果。

发表评论 评论 (2 个评论)

回复 beon 2024-4-7 15:53
最终业务的选择是 加hint  /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ 还是 改参数?

感觉加hint影响可控,只是麻烦点;改参数,业务有没有提出评估测试报告之类的证明材料?
回复 chongzh 2024-4-8 08:45
beon: 最终业务的选择是 加hint  /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ 还是 改参数?

感觉加hint影响可控,只是麻烦点;改参数,业务有没有提出评估测试报告之类 ...
几种方式任选: 升级数据库版本,加hint,改基线。   如果需要测试报告,那么也只能拉着业务一起测试了。

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-12-30 23:58 , Processed in 0.015792 second(s), 11 queries , Redis On.
返回顶部