2

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

我认为我已经将其范围缩小到 CTE。递归 CTE 是在几个早期 CTE 中处理的“馈送”数据,这似乎是问题所在。

我设置了一个示例数据集,如下所示:

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

然后,我获取第一个 CTE 的结果并在第二个 CTE 中执行自联接。
我希望所有行都加入,每个行都加入。实际发生的是不相等的行连接起来。

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

4

1 回答 1

9

这个结果没有什么意外的,除非你不理解它。

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

然而,在您的示例中,这是因为 ORDER BY NEWID() 为原始 CTE 的每个分辨率提供了不同的 row_number()-ing。您是否认为 CTE 存储在内存中并被缓存?在 SQLFiddle 站点上,在您的结果下,有一个“查看执行计划”链接。它显示了对 table 的 2 次不同的单独扫描

于 2012-10-15T08:17:42.000 回答