为什么CTE比光标/派生表/子查询/临时表等更好?

mcU*_*ser 5 sql-server common-table-expression

与派生表/子查询/临时表等方法相比,CTE如何以及为什么提供更好的性能?

临时数据库中发生任何临时计算.因此,如果我们有一个游标方法,它还会在临时数据库中创建临时表/工作表,一旦操作结束,该工作表就会被销毁.我对CTE的理解是,它也做同样的事情(或者它是否会在内存中创建临时结果?从而提高性能)那为什么它比上面的方法更好,比如游标/派生表/子查询/临时表等?

Mit*_*eat 8

(非递归)CTE不使用游标.这是一种基于集合的方法.与使用游标相比,这是一个很大的不同.但那就是一般不使用游标的情况.

在绝对可能的情况下应该避免使用游标(因为我确信我们都知道).

CTE不一定比使用派生表更好,但确实导致更易理解的TSQL代码.CTE实际上只是查询或子查询的简写; 类似于临时视图的东西.

相关问题:使用CTE有哪些优点/缺点?

  • +1游标是魔鬼的工作 - 尽可能远离它们!特别是在触发器......(我现在有一个如此恶魔般的数据库来处理......) (4认同)
  • 是的,在一个触发器内 - 并且在该游标内部,另一个表被更新,另一个触发器触发....另一个游标在里面......这个数据库应该真的被复制到DEV:NULL for good .... (2认同)
  • @barrypicker,可读性很好(它总是很复杂).这些层几乎是必需的,因此您可以将值x定义为column1*column2(实际上是一个时髦的case语句)然后,在layer2中,您可以在另一个计算中使用x而不会加倍(并打破DRY原则). (2认同)