Gid*_*dil 2 sql common-table-expression sql-server-2008
我创建了一个使用多个CTE的复杂过程(主要用于递归分层工作).
在小样本数据集上,一切都按预期进行,但是当我将代码应用于大型数据集时,我收到了意外(和错误)的结果.
我想我已经把它缩小到了CTE.递归CTE是在几个早期CTE中处理的"馈送"数据,这似乎是问题所在.
我设置了一个示例数据集如下:
然后,我获取第一个CTE的结果,并在第二个CTE中执行自连接.
我期望所有行都加入,每个行都是自己的.实际发生的是不相等的行加入.
有人可以提供这种行为的解释吗?
这个结果没有什么意外,除非您不理解.
每个CTE都被解析each and every time它被引用.是的,这就是为什么高事务性表上的简单CTE可能在一个引用中返回4行而在接下来的2个级别中返回5行.
然而,在你的样本上,这是因为ORDER BY NEWID(),给原始CTE的每个分辨率一个不同的row_number().您是否认为CTE存储在内存中并缓存?在SQLFiddle站点上,在您的结果下,有一个"查看执行计划"链接.它显示了表的2个不同的独立扫描.
| 归档时间: |
|
| 查看次数: |
499 次 |
| 最近记录: |