CTE出乎意料的结果

时间:2012-10-15 08:13:47

标签: sql sql-server-2008 common-table-expression

我创建了一个使用多个CTE的复杂过程(主要用于递归分层工作) 在小样本数据集上,一切都按预期进行,但当我将代码应用于大量数据时,我收到了意外(和错误)的结果。

我想我已经把它缩小到了CTE。递归CTE是在几个早期CTE中处理的“馈送”数据,这似乎是问题所在。

我按如下方式设置sample data set

  • 包含唯一数据的四行
  • 每行接收一个随机行号(这是在CTE中添加的

然后我接受第一次CTE的结果并在第二次CTE中进行自我加入 我期望所有行都加入,每个行都是自己的。实际发生的是不相等的行加入。

有人可以提供这种行为的解释吗?

1 个答案:

答案 0 :(得分:9)

这个结果并没有出乎意料,除非您不理解。

每个CTE都已解决each and every time它被引用。是的,这就是为什么高度事务性表上的简单CTE可能在一个引用中返回4行而在接下来的2个级别中返回5行。

然而,在你的样本上,这是因为ORDER BY NEWID(),给原始CTE的每个分辨率一个不同的row_number()。您是否认为CTE存储在内存中并缓存?在SQLFiddle站点上,在您的结果下,有一个“视图执行计划”链接。它显示 2个不同的,单独的表扫描