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