看似简单的T-SQL查询令人惊讶地缓慢

时间:2013-08-22 15:11:29

标签: sql sql-server-2008-r2

我从学区数据库(SQL Server 2008R2)的存储过程中取出(并匿名)了一些行:

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秒才能完成,如果可能的话我想减少这种情况。

谢谢!

3 个答案:

答案 0 :(得分:0)

你有iClassID索引吗?看起来你需要一个。

答案 1 :(得分:0)

原因很慢,可能是你错过了几个索引,或者索引太多了。

我会确保你的班级表上有一个主键,以及学生班级表中的iClassId索引。

答案 2 :(得分:0)

我同意这应该不花时间,即使你有很多索引,除非你有大的literalCLUSTERED INDEX索引文字。

你看过Execution Plan吗?

你会尝试在CTE之前积累update并在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