2017-01-04 24 views
3

对于使用字符串函数及其对性能的影响,我有一个常见问题。 我有一个列ID为非聚集索引的表。该列中有20位数字的varchar。 当我运行:在索引列性能上使用字符串函数的SQL

SELECT col1, col2 
FROM tbl 
WHERE ID = '00000000009123548754' 

结果回来非常快。 但是当我运行时

SELECT col1, col2 
FROM tbl 
WHERE RIGHT(ID, 10) = '9123548754' 

它需要很长时间。 第一个查询的估计执行计划有一个索引查找,其中第二个查询具有索引扫描。

我知道寻求反对扫描的原因之一是速度更快,但为什么字符串函数Right()会产生这样的影响?

+0

如果有20个数字,那么第二个数字将不返回任何行。 –

+3

那么,RIGHT()不能与您的索引基于的散列值一起使用,因此它必须评估每个ID值。根据您的查询尝试运行数据库引擎优化顾问,并查看它的内容。 – uncoder

+0

什么版本的数据库你使用的是? – geofftnz

回答

2

之所以有差异是因为必须为每一行解析RIGHT(ID,10)才能过滤它(因此需要扫描),而ID = '00000000009123548754'子句可以解析为简单查找。

从技术角度而言,您的第一个查询是sargable,而第二个查询不是(由于该函数)。