Sql server 使用临时表代替CTE进行一次性使用

Sql server 使用临时表代替CTE进行一次性使用,sql-server,rdbms,Sql Server,Rdbms,1如我所知,CTE更多地用于查询可读性,而不是性能。 如果不讨论索引,我们是否应该在所有情况下都使用临时表而不是CTE,因为它对性能没有任何好处,而且临时表可以实现与CTE相同的结果 2但是我仍然不能得到这个:Temp表是在Tempdb数据库中物理创建的,而CTE没有具体化。它们是在内存中创建的,并在下一个语句后立即处理。 我们是否应该有更快更好的性能来访问内存中的相同数据,而不是物化磁盘空间?如果您需要性能,请始终使用临时表 我将仅出于以下原因使用CTE: 非常小且一次性使用的温度数据 递归

1如我所知,CTE更多地用于查询可读性,而不是性能。 如果不讨论索引,我们是否应该在所有情况下都使用临时表而不是CTE,因为它对性能没有任何好处,而且临时表可以实现与CTE相同的结果

2但是我仍然不能得到这个:Temp表是在Tempdb数据库中物理创建的,而CTE没有具体化。它们是在内存中创建的,并在下一个语句后立即处理。
我们是否应该有更快更好的性能来访问内存中的相同数据,而不是物化磁盘空间?

如果您需要性能,请始终使用临时表

我将仅出于以下原因使用CTE:

  • 非常小且一次性使用的温度数据
  • 递归查询
在运行CTE时,在Tempdb数据库中物理创建临时表 没有实现它们是在内存中创建的并被处理掉 在下一次陈述之后马上

这是错误的<代码>CTE未创建,它不是包含数据的结构。它就像一个
视图
,唯一的区别是它的定义没有保存为对象。因此,它不能在其他语句中重用。这只是编写派生表的另一种形式

例如,当你写

with USAcusts as 
( 
  select custid, companyname 
  from sales.customers 
  where country = N'USA' 
) 
select * from USAcusts;
与下面的代码相同:

select *
from
   ( 
  select custid, companyname 
  from sales.customers 
  where country = N'USA' 
   ) t

CTE
派生表
都不是“在内存中创建的”,与
视图
中的情况完全相同,SQL Server扩展表表达式的定义,并直接查询底层对象

如果不看到确切的查询,很难给出准确的答案。是的,使用临时表是提高性能的一个技巧。如果你能以一种很好的方式为临时表编制索引,这一点尤其正确。你似乎在试图问一些问题,而不是问一些问题!在我看来,始终使用CTE是不对的。对于小表和结果集,以及琐碎的使用,CTE可能会更快,因为它不涉及创建临时表和填充临时表。这完全是错误的。临时表的性能可能比cte差。没有“一条规则适用于所有查询”。这就是为什么我说我只会在“非常小且一次性使用临时数据”的情况下使用它。