【问题标题】:SQL Server with clause versus temporary table带子句的 SQL Server 与临时表
【发布时间】:2013-05-22 16:01:14
【问题描述】:

我也可以

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

select * from #randomTenUsers

WITH randomTenUsers   as (select top 10 * from users)    

select * from randomTenUsers

据我了解,WITH 语句也会创建一个临时结果集。

为什么应该优先使用 WITH 而不是临时表,反之亦然?

【问题讨论】:

  • 对于 CTE (WITH) 何时比临时表更好或性能更好,没有硬性规定。如果您需要多个语句的数据 -> 那么您需要一个临时表,因为 CTE 仅存在于下一条语句。另一方面,使用 CTE 比设置、填充、操作和最终删除临时表要容易得多,也不那么麻烦。所以最后:这取决于你的具体情况;如果这两种方法都可以完成这项工作,我会先使用 CTE,但如果它对性能至关重要,也可以使用临时表进行测试并选择
  • 我们有一个例子,使用 CTE 的结果比使用临时表要差得多。如果您的查询适用于大量数据(超过几千行),那么两者都值得尝试。显然,这可能是因为 SQL Server 不为 CTE 保留统计信息(如行数),但它为临时表保留。这可能会导致执行计划不理想。

标签: sql-server sql-server-2008-r2


【解决方案1】:

据我了解 WITH 语句也会创建一个临时结果 设置。

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

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


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

select * 
from (
     select top 10 * 
     from users
     ) x;

作为marc_s said in the comment,你应该使用什么取决于你想做什么。在某些情况下创建临时表非常有意义,而在某些情况下则完全没有必要。

【讨论】:

  • 所以我收集的WITH语句主要是为了提高代码的可读性。
  • @Foo 它可以在多于一个查询的地方重用。它也可以在它自己内部重用以构建一个 reqursive 查询。
猜你喜欢
  • 1970-01-01
  • 2010-12-25
  • 2011-06-01
  • 1970-01-01
  • 2012-02-13
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
相关资源
最近更新 更多