Doris 4.1.1-rc01 在 UNION DISTINCT + ORDER BY + LIMIT/OFFSET 且宽投影场景下返回错误结果
#65786
Unanswered
gimmickj
asked this question in
A - General / Q&A
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Doris 4.1.1-rc01 在
UNION DISTINCT + ORDER BY + LIMIT/OFFSET且宽投影场景下返回错误结果问题概述
我们在 Doris
4.1.1-rc01上发现了一个 wrong-result 问题。这条 SQL 最初来自一个 Entity Framework Core Provider(
EFCore.Doris)生成的查询,但问题可以通过 直接使用 Doris FE 的 MySQL 协议执行原始 SQL 稳定复现,因此这看起来不是 EF 的实体物化、跟踪或查询层逻辑错误,而是 Doris 自身的查询计划/执行问题。最关键的现象是:
ROW_NUMBER()分页形式:结果正确并且从
EXPLAIN看,宽投影场景下 branch-local pushedVTOP-N的排序键发生了错误变化。Doris 版本
原始 EF Core 查询形状
对应的 LINQ 查询大致如下:
重要说明
虽然这条查询最初来自 EF Core,但问题可以通过 直接执行原始 SQL 复现。
在我的环境里,需要先执行:
否则仅仅依赖连接串中的
Database=northwind,Doris FE 仍可能返回:复现 SQL
1. 错误场景:宽投影
实际结果
期望结果
对照场景
2. 窄投影时结果正确
正确结果
3. 改写成
ROW_NUMBER()后结果正确正确结果
EXPLAIN的关键差异窄投影场景
branch-local pushed
VTOP-N使用的排序键是:这和外层查询的:
是一致的,因此结果正确。
宽投影场景
外层查询仍然是:
但 branch-local pushed
VTOP-N却变成了:也就是说,局部 TopN 的排序键被错误地从
ContactName变成了Address。这看起来就是最终 wrong-result 的直接原因:局部先按错误的列做了截断,后续即使外层再按
ContactName排序,也已经拿不到正确候选行。已尝试但无效的排查项
以下设置都 没有改变错误结果,也没有改变计划形状:
这意味着问题看起来不能通过简单关闭这些 rewrite rule 来规避。
为什么认为这是 Doris 问题
ROW_NUMBER()改写后结果正确,说明数据本身没有问题。EXPLAIN已经显示宽投影场景下 branch-localVTOP-N使用了错误排序键(Address而非ContactName)。enable_nereids_planner=false,都没有改变结果和计划。疑似问题范围
这个问题很像 Doris 在以下组合场景中的 wrong-result bug:
UNION DISTINCTORDER BYLIMIT/OFFSET目前最强的证据是:
ContactName错误变成了Address补充说明
我们目前在 EF Core Provider 侧通过把这类查询改写成
ROW_NUMBER()分页形式进行规避,但还是希望帮助定位 Doris 本身的根因。如果需要,我也可以补充:
EXPLAINBeta Was this translation helpful? Give feedback.
All reactions