2010-10-29 92 views
0

很慢的請求,在我的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 

所有其他請求(包括巨大的請求),不使用臨時表是ru nning很好,而每個使用臨時表的請求似乎都會出現相同的性能問題。這些請求通常都會在昨天快速運行,我想不出任何可能會發生的異常情況。

我檢查了我的tempdb中使用spaceused(70MB解脫出來的85 MB)

不夠豐滿,我也檢索到的執行計劃:

alt text

這是什麼原因這表現非常糟糕?有什麼我應該解決這個問題?

回答

2

中間排序是昂貴+,你可以在查詢計劃中看到一個感嘆號,可能丟失統計

如果添加一個索引(或主鍵),它將運行更快,因爲數據將是「分類預「你會得到統計數據

4

最好的辦法是在A上添加一個索引或將A設置爲表的主鍵。

+2

如果您將A設置爲主鍵,則會自動在該表上設置一個「集羣索引」。這可能是你最好的選擇。它不僅會刪除排序,而且還會用Clustered Index掃描替換表掃描(並大幅提高性能)。 – 2010-10-29 15:53:22