【问题标题】:SQL Using a String Function on Indexed Column PerformanceSQL 在索引列性能上使用字符串函数
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2012-02-09
    • 1970-01-01
    • 2019-03-18
    • 2013-05-31
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多