我创建了一个使用多个 CTE 的复杂流程(主要用于递归分层工作)。
在小样本数据集上,一切都按预期进行,但是当我将代码应用于大数据集时,我收到了意外(且错误)的结果。
我想我已经将范围缩小到了 CTE。递归 CTE 是在几个早期 CTE 中处理的“馈送”数据,这似乎就是问题所在。
我设置了一个样本数据集 http://sqlfiddle.com/#!3/c8a47/6如下:
- 四行具有唯一数据
- 每行接收一个随机行号(这被添加到 CTE 中)
然后,我获取第一个 CTE 的结果并在第二个 CTE 中执行自连接。
我期望所有行都加入,每一行都连接到自己。实际发生的情况是不相等的行连接在一起。
有人可以对此行为提供解释吗?
这个结果并没有什么意外的,除非你不理解它。
每个 CTE 均已解决each and every time
它被引用。是的,这就是为什么高度事务性表上的简单 CTE 可以在一个引用中返回 4 行,并在接下来的 2 个级别中返回 5 行。
然而,在您的示例中,这是因为 ORDER BY NEWID() 为原始 CTE 的每个分辨率提供了不同的 row_number()-ing。您是否认为 CTE 存储在内存中并缓存?在 SQLFiddle 站点上的结果下方,有一个“查看执行计划”链接。表明对表进行 2 次不同的、单独的扫描.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)