【发布时间】:2017-05-18 04:28:45
【问题描述】:
我有一个关于使用字符串函数及其对性能的影响的一般性问题。 我有一个关于列 ID 的非聚集索引的表。该列中有 20 位 varchar。 当我跑步时:
SELECT col1, col2
FROM tbl
WHERE ID = '00000000009123548754'
结果很快就回来了。 但是当我跑步时
SELECT col1, col2
FROM tbl
WHERE RIGHT(ID, 10) = '9123548754'
这需要很长时间。 第一个查询的估计执行计划有一个 Index Seek,而第二个查询有一个 Index Scan。
我知道 Seek 与 Scan 相反是一个更快的原因,但是为什么 String Function Right() 有这样的影响?
【问题讨论】:
-
如果有 20 位数字,则第二个将不返回任何行。
-
好吧,RIGHT() 不能与索引所基于的散列值一起使用,因此它必须评估每个 ID 值。尝试针对您的查询运行数据库引擎优化顾问,看看它会产生什么结果。
-
你使用什么版本的数据库?
-
SQL Server 2005
-
我们在谈论多少行?
标签: sql sql-server performance indexing sql-server-2005