我有一个关于使用字符串函数及其对性能影响的一般性问题。 我在列ID上有一个非聚集索引的表。该列中包含20位数的varchar。 我跑的时候:
SELECT col1, col2
FROM tbl
WHERE ID = '00000000009123548754'
结果很快就会回来。 但是当我跑步时
SELECT col1, col2
FROM tbl
WHERE RIGHT(ID, 10) = '9123548754'
这需要很长时间。 第一个查询的估计执行计划具有索引查找,其中第二个查询具有索引扫描。
据我所知,Seek与Scan相反是一个更快的原因,但为什么String Function Right()会产生这样的影响呢?
答案 0 :(得分:2)
存在差异的原因是因为必须为每一行解析RIGHT(ID,10)
以便对其进行过滤(因此扫描),而ID = '00000000009123548754'
子句可以解析为简单的搜索
在技术方面,您的第一个查询是sargable,而第二个查询不是(由于该功能)。