SQL中CROSS APPLY关联随机行的异常问题及原因咨询
问题原因解析
这是SQL Server查询优化器的**常量折叠(Constant Folding)**行为导致的:
初始语句只执行一次子查询
当CROSS APPLY的子查询完全不引用外部查询的任何列时,优化器会判定该子查询是独立于外部上下文的“常量计算”,只会执行一次,把得到的结果复用给外部查询的所有行。所以你看到所有行关联的[User]表ID完全相同——哪怕用RAND(CHECKSUM(NEWID()))替代NEWID()也没用,因为优化器依然会把这个不依赖外部列的表达式当作常量处理,只计算一次。添加无意义条件后触发逐行执行
加入sc.name = sc.name这个条件后,优化器会认为子查询依赖于外部表的列(sc.name),哪怕这个条件永远为真。此时优化器会放弃常量折叠逻辑,改为对外部查询的每一行都单独执行一次CROSS APPLY的子查询:每次执行时ORDER BY NEWID()都会重新生成随机排序,自然就能得到不同的[User]表ID。
本质上,这个无意义条件的作用是让优化器认为子查询和外部行存在关联,从而强制逐行执行子查询。类似的效果也可以通过在子查询的排序或筛选中引用任何外部列实现(比如ORDER BY NEWID(), sc.name)。
内容的提问来源于stack exchange,提问作者OzrenTkalcecKrznaric
相关产品推荐
相关产品推荐

