Sql server SQL Server:在like中使用的索引列?

Sql server SQL Server:在like中使用的索引列?,sql-server,tsql,indexing,Sql Server,Tsql,Indexing,索引仅在类似操作中使用的varchar列是一个好主意吗?从查询分析中可以看出,我从以下查询中获得: SELECT * FROM ClientUsers WHERE Email LIKE '%niels@bosmainter%' 我得到的“估计子树成本”为0.38(不含任何索引),0.14(含索引)。如果查询已经使用索引进行了优化,那么这是一个用于分析的好指标吗?根据我的经验,第一个符号将使任何索引都无用,但最后一个将使用索引。回答问题的度量部分:执行的索引/表扫描/查找类型是了解索引是否(正确

索引仅在类似操作中使用的varchar列是一个好主意吗?从查询分析中可以看出,我从以下查询中获得:

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

我得到的“估计子树成本”为0.38(不含任何索引),0.14(含索引)。如果查询已经使用索引进行了优化,那么这是一个用于分析的好指标吗?

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

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

以下扫描/寻道类型从最差的(顶部)到最佳的(底部)排序:

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

根据经验,只要可能,您通常都会尝试通过扫描进行搜索。与往常一样,根据表大小、查询的列等,也有例外情况。我建议您对“扫描搜索索引”进行搜索,您将获得有关此主题的许多好信息。

给定数据“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”的重要查询,可以使用一个持久计算列,在该列中反转()列,然后对其进行索引。然后,您可以查询:

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

“足够接近-LIKE”将在索引上使用前缀,但您无法通过索引解析通配符,因此这是它的极限。这些列上的索引是“是”还是“不是”?如果您总是以前导%查询该列,则永远不会使用该索引。因此,答案取决于您如何查询数据。这不是完全正确的,您可以在使用“%xyz”之类的查询上找到索引,但您需要做一些额外的工作,请参阅我的答案以获得解释我喜欢您的解决方案,尽管我称之为丑陋的黑客;)我曾在一个系统上使用过这种丑陋的破解,最初的设计者用前导零和其他键字母+前导零来制作数字char(x)。尝试告诉用户他们必须输入前导零和/或字母+前导零!哈他们想进入203,而不是G000000203,所以这个反向()“hack”将在那里有所帮助。@KM。这里引用了这个答案:我不会称之为hack,但这是一个非常好的解决方案。这是一个漂亮而丑陋的hack。当使用数据表类型场景搜索大型表时,这是一个非常有问题的问题,其中所有列都需要进行.contains搜索