一尘不染

CTE 和Temp Table有什么区别?

sql

公用表表达式 (CTE) 和临时表有什么区别?我什么时候应该使用其中一个?

CTE

WITH cte (Column1, Column2, Column3)
AS
(
    SELECT Column1, Column2, Column3
    FROM SomeTable
)

SELECT * FROM cte

Temp Table

SELECT Column1, Column2, Column3
INTO #tmpTable
FROM SomeTable

SELECT * FROM #tmpTable

阅读 148

收藏
2022-10-21

共1个答案

一尘不染

这是相当广泛的,但我会尽可能地给你一个笼统的答案。

CTE…

  • 不可索引(但可以在引用对象上使用现有索引)
  • 不能有约束
  • 基本上都是一次性VIEW
  • 仅持续到运行下一个查询
  • 可以递归
  • 没有专用的统计信息(依赖于底层对象的统计信息)

#*Temp Tables…*

  • 是存在于 tempdb 中的真实物化表
  • 可以索引
  • 可以有约束
  • 在当前 CONNECTION 的生命周期内持续存在
  • 可以被其他查询或子过程引用
  • 拥有引擎生成的专用统计数据

至于何时使用它们,它们有非常不同的用例。如果您将有一个非常大的结果集,或者需要多次引用它,请将其放在一个#temp表中。如果它需要是递归的,是一次性的,或者只是为了在逻辑上简化某些东西,aCTE是首选。

此外, a永远不CTE应该用于 performance。使用 CTE 几乎永远不会加快速度,因为它只是一次性视图。你可以用它们做一些巧妙的事情,但加速查询并不是其中之一。

2022-10-21