[翻译]CTE表达式和临时表的区别

翻译于dba.stackexchange.com
版权归原作者所有,本人只是业余爱好翻译。


这个问题是相当广泛的,但尽我所能给你一个普通的回答。

CTEs

  • 不可以建索引(但可以使用引用到的对象的索引)
  • 不能有约束
  • 本质上是一个一次性视图
  • 只在下一个执行查询时存在
  • 可以递归
  • 没有专门的统计状态数据(只依赖于底层对象)

临时表

  • 是存在于临时数据库的真正物化的表
  • 可以建索引
  • 可以有约束
  • 在当前连接的会话中会一直存在
  • 可以被其他查询或子查询引用
  • 引擎可以有专门为它准备的统计数据

至于何时使用哪个,他们有不同的应用场景。如果你会有一个非常大的结果集,或者需要不上一次地引用它,那请使用临时表。如果需要使用递归,一次性,或者做一些简单的逻辑计算,那就使用CTE。

注意,CTE永远不应该用于性能。使用CTE并不会提高你的性能,因为,它仅仅是个一次性视图。你可以用它做一些其他的事,但是为了加快查询真的并不是它的用途。