我是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)。
由于
答案 0 :(得分:2)
查询计划的缓存肯定会影响你第二次运行的速度。
只是一个理论,如果不是这种情况,也许是它的修剪。 select distinct用于匹配每个字符串,如果这些字符串缩短到一个修剪它的字符可能更少。
取决于您的数据库引擎,还可以查看binary_checksum是否会更快。如果这有效可能我的理论是正确的。
((SELECT COUNT(DISTINCT BINARY_CHECKSUM(LTRIM(RTRIM(UPPER(StudentID)))))