我对 SQL Server 2005 中的执行计划不熟悉,但这让我很困惑。
当我运行这段代码时......
((SELECT COUNT(DISTINCT StudentID)
FROM vwStudentUnitSchedules AS v
WHERE v.UnitActive = 1
AND v.UnitOutcomeCode IS NULL
AND v.UnitCode = su.UnitCode
AND v.StartDate = su.StartDate
AND v.StudentCampus = st.StudentCampus) - 1) AS ClassSize
要获得班级规模,它会超时并一般运行,大约需要 30 秒
但是当我用这个轻微的修改运行它时......
((SELECT COUNT(DISTINCT LTRIM(RTRIM(UPPER(StudentID))))
FROM vwStudentUnitSchedules AS v
WHERE v.UnitActive = 1
AND v.UnitOutcomeCode IS NULL
AND v.UnitCode = su.UnitCode
AND v.StartDate = su.StartDate
AND v.StudentCampus = st.StudentCampus) - 1) AS ClassSize
它几乎立即运行。
是因为 LTRIM() RTRIM() 和 UPPER() 函数吗?为什么他们会让事情进展得更快?我想这是因为 COUNT(DISTINCT 是一个从左到右逐个字符计数的聚合?是的 StudentID 是一个 VARCHAR(10)。
谢谢