翻译于dba.stackexchange.com
版权归原作者所有,本人只是业余爱好翻译。
这个问题是相当广泛的,但尽我所能给你一个普通的回答。
CTEs
- 不可以建索引(但可以使用引用到的对象的索引)
- 不能有约束
- 本质上是一个一次性视图
- 只在下一个执行查询时存在
- 可以递归
- 没有专门的统计状态数据(只依赖于底层对象)
临时表
- 是存在于临时数据库的真正物化的表
- 可以建索引
- 可以有约束
- 在当前连接的会话中会一直存在
- 可以被其他查询或子查询引用
- 引擎可以有专门为它准备的统计数据
至于何时使用哪个,他们有不同的应用场景。如果你会有一个非常大的结果集,或者需要不上一次地引用它,那请使用临时表。如果需要使用递归,一次性,或者做一些简单的逻辑计算,那就使用CTE。
注意,CTE永远不应该用于性能。使用CTE并不会提高你的性能,因为,它仅仅是个一次性视图。你可以用它做一些其他的事,但是为了加快查询真的并不是它的用途。