2013-08-22 22 views
0

我拉出(和匿名)從存儲過程中的某些行的學區數據庫(SQL Server 2008 R2):似乎簡單的T-SQL查詢慢得出奇

INSERT INTO ClassFilter -- guaranteed empty 
SELECT 
    Class.iClassID, 
    'Literal Text', 
    COUNT(iStudentID) 
FROM 
    Class INNER JOIN StudentClass ON Class.iClassID = StudentClass.iClassID 
GROUP BY 
    Class.iClassID 

Class表只有2000條目,並且ClassStudent約有30,000。執行此操作的存儲過程需要大約25秒才能完成,並且如果可能的話,我想盡量減少。

謝謝!

+0

好吧,我是全新的創造我自己的索引(數據庫是由外部供應商提供),但我這個做了嘗試:
CREATE INDEX ON StuClassStu StudentClass(iStudentID)
CREATE INDEX ON StuClassCls StudentClass(iClassID)

的再修改現在運行在兩秒鐘之內,所以謝謝! –

回答

0

你有iClassID索引嗎?看起來你需要一個。

0

這個速度慢的原因可能是你錯過了一對索引或者索引太多。

我會確保你的類表上有一個主鍵以及在studentclass表中的iClassId上的一個索引。

0

我同意這應該不花時間,即使你有很多索引,除非你有大的literalCLUSTERED INDEX索引它的字面。

你看過Execution Plan嗎?

,你會嘗試updateCTE內部積累和做UPDATE是這樣的:

;WITH StudentsInClass AS 
(
    SELECT iClassID, COUNT(0) AS StudentsCount 
    FROM StudentClass 
    GROUP BY iClassID 
) 
INSERT INTO ClassFilter -- guaranteed empty 
SELECT 
    Class.iClassID, 
    'Literal Text', 
    StudentsCount 
FROM Class 
INNER JOIN StudentsInClass ON Class.iClassID = StudentsInClass.iClassID 
+0

就像我說的那樣,索引本身就有很大的不同,但我也會嘗試一下。 –

+0

'SQL Server'應該可以在沒有索引的情況下立即處理30k。應該在需要時添加索引。這就是我問你是否看過「執行計劃」的原因,它說明了很多。 –

+0

現在它更快 - 眨眼之間。感謝所有關於這個問題。 –