Sql server SQL Server递归CTE是否被视为循环?

Sql server SQL Server递归CTE是否被视为循环?,sql-server,common-table-expression,Sql Server,Common Table Expression,我的印象是递归CTE是基于集合的,但有人提到它们是循环 递归CTE是基于集合的吗?假设基于集合的操作不能是循环,我错了吗?如果它是递归的,它仍然被认为是循环。 尽管一条语句是基于集合的,但反复调用它可以被视为一个循环。这是一个基于所使用上下文的定义或措辞的论点。它们是基于集合的语句,但处理过程被简单地视为循环过程 对于那些感兴趣的人,这里有一篇关于CTE性能的小文章: 它们是基于设置的。递归集合仍然是集合 但是,如果你用足够强大的放大镜观察,所有的设置操作都是循环。最终,代码在CPU上运行,CP

我的印象是递归CTE是基于集合的,但有人提到它们是循环


递归CTE是基于集合的吗?假设基于集合的操作不能是循环,我错了吗?

如果它是递归的,它仍然被认为是循环。 尽管一条语句是基于集合的,但反复调用它可以被视为一个循环。这是一个基于所使用上下文的定义或措辞的论点。它们是基于集合的语句,但处理过程被简单地视为循环过程

对于那些感兴趣的人,这里有一篇关于CTE性能的小文章:


它们是基于设置的。递归集合仍然是集合


但是,如果你用足够强大的放大镜观察,所有的设置操作都是循环。最终,代码在CPU上运行,CPU执行在离散内存区域上运行的串行指令流。换句话说,没有面向集合的硬件。“以设定为导向”是一个合乎逻辑的概念。所有SQL操作最终都是使用某种形式的循环实现的,这是一个实现细节。

我认为需要做的区别是“尾部递归”与“一般递归”

所有尾部递归都可以实现为循环,而不需要堆栈

通用递归支持也可以作为循环实现,但要使用堆栈


递归CTE是尾部递归,因此本质上是一个循环。唯一的区别是终止条件由SQL语义/执行引擎处理。每个循环迭代的输出都是联合的或是您指定的任何集合。

+1因为这仍然是一个很好的问题。声明性和过程性可能是一个更有用和更有意义的区别?事实上,即使是伊齐克·本·甘(Itzik Ben Gan)的循环,毫无疑问也是作为查询计划中的一组嵌套循环来实现的。