为什么COUNT(DISTINCT fieldA)比COUNT慢(DISTINCT LTRIM(RTRIM(UPPER(fieldA))))?

Lof*_*fty 5 sql performance sql-server-2005

我是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
Run Code Online (Sandbox Code Playgroud)

为了获得班级规模,它会超时并且一般地运行它,它需要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
Run Code Online (Sandbox Code Playgroud)

它几乎立即运行.

是因为LTRIM()RTRIM()和UPPER()函数?他们为什么要让事情变得更快?我想这是因为COUNT(DISTINCT是一个按字符从左到右计算的聚合?是StudentID是VARCHAR(10).

谢谢

Tho*_*ris 2

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

这只是一个理论,如果情况并非如此,那么可能就取决于修剪了。选择不同的字符串是为了匹配每个字符串,如果这些字符串较短,则可能会修剪较少的字符。

根据您的数据库引擎,还可以看看binary_checksum是否会让它更快。如果这有效,也许我的理论是正确的。

 ((SELECT COUNT(DISTINCT BINARY_CHECKSUM(LTRIM(RTRIM(UPPER(StudentID)))))
Run Code Online (Sandbox Code Playgroud)