【问题标题】:SQL Server: Index columns used in like?SQL Server:使用的索引列喜欢吗?
【发布时间】:2010-11-26 03:51:49
【问题描述】:

索引仅在 LIKE 操作中使用的 varchar 列是否是个好主意?从我可以从查询分析中读取的内容中,我从以下查询中得到:

SELECT * FROM ClientUsers WHERE Email LIKE '%niels@bosmainter%'

我得到的“估计子树成本”为 0.38,没有任何索引,0.14 有索引。如果查询已使用索引进行了优化,这是否是用于分析的好指标?

【问题讨论】:

  • 这在搜索具有数据表类型场景的大型表时非常有问题,其中所有列都需要进行 .contains 搜索

标签: sql-server tsql indexing


【解决方案1】:

给定数据'abcdefg'

WHERE Column1 LIKE '%cde%'  --can't use an index

WHERE Column1 LIKE 'abc%' --can use an index

WHERE Column1 Like '%defg' --can't use an index, but see note below

注意:如果您有需要 '%defg' 的重要查询,则可以在 REVERSE() 列中使用持久计算列,然后对其进行索引。然后您可以查询:

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index

【讨论】:

  • 我喜欢你的解决方案,虽然我会称之为丑陋的 hack ;)
  • 我在一个系统上使用了这个丑陋的 hack,原始设计者用前导零和其他键字母+前导零制作数字 char(x)。尝试告诉用户他们必须输入前导零和/或字母+前导零!哈。他们想进入 203,而不是 G000000203,所以这个 reverse() “hack” 将在那里提供帮助。
  • @KM。在这里引用了这个答案:dba.stackexchange.com/questions/91340/…
  • 我不会称其为 hack,而是一个非常好的解决方案。
  • 这是一个美丽的丑陋的黑客
【解决方案2】:

根据我的经验,第一个 % 符号会使任何索引都无用,但最后一个会使用索引。

【讨论】:

  • 足够接近 - LIKE 将在索引上使用前缀,但您无法通过索引解析通配符,因此只能如此。
  • 这些列上的索引是好是坏?
  • 如果总是查询以% 开头的列,则永远不会使用索引。因此,答案取决于您如何查询数据。
  • 不完全正确,您可以在使用 LIKE '%xyz' 的查询中找到索引,但是您需要做一些额外的工作,请参阅我的答案以获得解释
【解决方案3】:

回答您问题的指标部分:正在执行的索引/表扫描/搜索的类型是了解索引是否(正确)使用的一个很好的指标。它通常显示在查询计划分析器的最顶部。

以下扫描/搜索类型按从最差(顶部)到最佳(底部)排序:

  • 表扫描
  • 聚集索引扫描
  • 索引扫描
  • 聚集索引搜索
  • 索引搜索

根据经验,您通常会尽可能地尝试通过扫描进行搜索。与往常一样,根据表的大小、查询的列等,会有一些例外。我建议为“扫描搜索索引”做一个search on StackOverflow,你会得到很多关于这个主题的好信息。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2011-03-14
    • 1970-01-01
    • 2011-01-23
    • 2018-04-02
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多