我创建了一个使用多个CTE的复杂过程(主要用于递归分层工作) 在小样本数据集上,一切都按预期进行,但当我将代码应用于大量数据时,我收到了意外(和错误)的结果。
我想我已经把它缩小到了CTE。递归CTE是在几个早期CTE中处理的“馈送”数据,这似乎是问题所在。
我按如下方式设置sample data set:
然后我接受第一次CTE的结果并在第二次CTE中进行自我加入 我期望所有行都加入,每个行都是自己的。实际发生的是不相等的行加入。
有人可以提供这种行为的解释吗?
答案 0 :(得分:9)
这个结果并没有出乎意料,除非您不理解。
每个CTE都已解决each and every time
它被引用。是的,这就是为什么高度事务性表上的简单CTE可能在一个引用中返回4行而在接下来的2个级别中返回5行。
然而,在你的样本上,这是因为ORDER BY NEWID(),给原始CTE的每个分辨率一个不同的row_number()。您是否认为CTE存储在内存中并缓存?在SQLFiddle站点上,在您的结果下,有一个“视图执行计划”链接。它显示 2个不同的,单独的表扫描。