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

时间:2018-12-19 06:09:56

标签: sql-server rdbms

1据我所知,CTE更多地用于查询的可读性,而不是性能。 不用谈论索引,我们是否应该在所有情况下都只使用temp表而不使用CTE,因为无论如何都没有性能优势,并且temp表可以实现与CTE相同的结果?

2但是我仍然无法得到:临时表是在Tempdb数据库中物理创建的,而CTE没有实现。它们在内存中创建,并在下一条语句后立即销毁。 我们是否应该有更快的更好的性能来访问内存中的相同数据而不是物化磁盘空间?

2 个答案:

答案 0 :(得分:2)

  

温度表是在Tempdb数据库中物理创建的,而CTE是   没有实现。 它们是在内存中创建的并已被处理掉   在下一条语句之后马上。

这是错误的。 CTE未创建,它不是包含数据的结构。就像view一样,唯一的区别是其定义未保存为对象。结果,它不能在其他语句中重用。这只是编写派生表的另一种形式。

例如,当您编写

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

CTEderived table都不是“在内存中创建的”,就像在view情况下一样,SQL Server 扩展表表达式的定义直接查询基础对象

答案 1 :(得分:0)

如果您要寻找性能,请始终使用临时表。

出于以下原因,我只会使用CTE:

  • 很小,只有1次使用临时数据
  • 递归查询