Sql server SQL Server with子句与临时表

Sql server SQL Server with子句与临时表,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我也可以 select * into #randomTenUsers from (select top 10 * from users)x select * from #randomTenUsers 或 根据我对WITH语句的理解,它还创建了一个临时结果集 是否有理由认为WITH应优先于temp表格,反之亦然 从我对语句的理解来看,它也会产生暂时的结果 设定 不,没有。使用CTE不会创建“临时结果集”。查询创建工作表可能有其原因,但仅仅因为您使用的是CTE并不是其中之一 这两个查询具

我也可以

select * into #randomTenUsers from
(select top 10 * from users)x    

select * from #randomTenUsers

根据我对WITH语句的理解,它还创建了一个临时结果集

是否有理由认为WITH应优先于temp表格,反之亦然

从我对语句的理解来看,它也会产生暂时的结果 设定

不,没有。使用CTE不会创建“临时结果集”。查询创建工作表可能有其原因,但仅仅因为您使用的是CTE并不是其中之一

这两个查询具有相同的查询计划,它们都不会像tempdb中的temp表那样创建临时结果





因为,你应该使用什么取决于你想做什么。在某些情况下,创建临时表是完全有意义的,在某些情况下完全没有必要创建临时表。

对于何时CTE(带)比临时表更好或性能更好,没有硬性规定。如果您需要多个语句的数据->那么您需要一个临时表,因为CTE只存在于下一个语句中。另一方面,使用CTE比设置、填充、操作并最终删除临时表更容易,也不那么麻烦。所以最后:这取决于你的具体情况;如果这两种方法都能做到这一点,我会首先使用CTE,但如果它对性能至关重要,还可以使用临时表进行测试,并进行挑选。我们有一个例子,使用CTE的结果比使用临时表的结果差得多。如果您的查询处理大量数据(超过几千行),那么这两种方法都值得尝试。显然,这可能是因为SQL Server不为CTE保留统计数据(如行计数),但为临时表保留统计数据。这可能会导致次优的执行计划。因此我收集的语句主要是为了提高代码的可读性。@Foo它可以在查询中的多个位置重复使用。它还可以在It内部重用,以构建请求查询。
WITH randomTenUsers   as (select top 10 * from users)    

select * from randomTenUsers
with randomTenUsers as
(
  select top 10 *
  from users
)    
select * 
from randomTenUsers;
select * 
from (
     select top 10 * 
     from users
     ) x;