5

我对 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)。

谢谢

4

1 回答 1

2

查询计划的缓存肯定会影响您第二次运行的速度。

只是一个理论,如果不是这样的话,也许它归结为修剪。选择不同的是匹配每个字符串,如果这些字符串更短,则可能会修剪其更少的字符。

根据您的数据库引擎,还可以查看 binary_checksum 是否会使其更快。如果这可行,也许我的理论是正确的。

 ((SELECT COUNT(DISTINCT BINARY_CHECKSUM(LTRIM(RTRIM(UPPER(StudentID)))))
于 2013-10-23T06:55:08.167 回答