0

我从学区数据库(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 秒才能完成,如果可能的话,我想减少这种方式。

谢谢!

4

3 回答 3

0

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

于 2013-08-22T15:16:10.823 回答
0

这么慢的原因可能是您缺少几个索引或索引太多。

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

于 2013-08-22T15:16:27.920 回答
0

我同意这根本不需要任何时间,即使你有很多索引,除非你有一个很大literalCLUSTERED INDEX索引,那就是它。

你看了Execution Plan吗?

CTE你会尝试在 a之前积累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
于 2013-08-22T15:24:11.847 回答