sql-server – CTE和临时表有什么区别?

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

CTE

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

SELECT * FROM cte

临时表

SELECT Column1,Column3
INTO #tmpTable
FROM SoMetable

SELECT * FROM #tmpTable

解决方法

这是相当广泛的,但我会尽可能地给你一般答案.

CTE的…

>是不可索引的(但可以在引用的对象上使用现有索引)
>不能有约束
>基本上是一次性VIEW
>仅在下一个查询运行之前保留
>可以递归
>没有专门的统计数据(依赖于底层对象的统计数据)

#Temp Tables …

>是tempdb中存在的真实物化表
>可以编入索引
>可以有约束
>坚持当前CONNECTION的生命
>可以由其他查询或子过程引用
>拥有引擎生成的专用统计数据

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

此外,CTE绝不应该用于性能.你几乎不会通过使用CTE来加快速度,因为它再次只是一次性视图.你可以用它们做一些巧妙的事情,但加速查询并不是真正的问题之一.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...