【问题标题】:Very slow request on temporary table对临时表的请求非常慢
【发布时间】:2010-10-29 15:47:14
【问题描述】:

在我的 MS SQL Server 2008 上,我创建了一个像这样的临时表:

create table #test
(
A varchar(50),
B int,
)

insert into #test select 'a',45
insert into #test select 'b',587
insert into #test select 'a',4
insert into #test select 'b',58

现在下面的请求需要永远

select A,SUM(B) from #test group by A -- takes 4 seconds to execute

虽然以下请求是即时的

select * from #test order by A
select SUM(B) from #test

所有其他不使用临时表的请求(包括大请求)都运行良好,而使用临时表的每个请求似乎都遇到了相同的性能问题。昨天这些请求通常都运行得很快,我想不出从那以后会发生什么不寻常的事情。

我使用已用空间检查了我的 tempdb 未满(85 MB 中有 70 MB 可用)

我也检索到了执行计划:

什么可能导致这种非常糟糕的性能?有什么我应该解决的问题吗?

【问题讨论】:

    标签: sql performance sql-server-2008


    【解决方案1】:

    您最好的选择可能是在 A 上添加索引或将 A 设置为表的主键。

    【讨论】:

    • 如果设置A为主键,会自动在表上建立聚集索引。这可能是你最好的选择。它不仅会删除排序,还会用聚集索引扫描替换您的表扫描(并显着提高性能)。
    【解决方案2】:

    中间排序很昂贵 + 你可以在查询计划中看到一个感叹号,可能缺少统计信息

    如果您添加索引(或主键),它将运行得更快,因为数据将被“预先排序”并且您将获得关于它的统计信息

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 2020-01-17
      • 2017-02-14
      • 1970-01-01
      • 2013-09-05
      • 2015-11-23
      • 1970-01-01
      • 2013-04-05
      • 2015-05-20
      相关资源
      最近更新 更多