我正在寻找一个查询,该查询将在使用非聚集索引构建的街道地址字段上使用非聚集索引计划。我遇到的问题是,如果我正在搜索街道地址,我很可能会使用“like”评估函数。我在想使用这个函数会导致表扫描而不是使用索引。在这种情况下,我将如何写一个?在 address3 字段上放置非聚集索引是否毫无意义?提前致谢。
4 回答
如果您的 LIKE 表达式正在执行字符串开头搜索 ( Address LIKE 'Blah%'
),我希望使用索引,很可能是通过索引搜索。
如果您搜索Address LIKE '%Blah%'
,将发生表扫描/索引扫描,具体取决于您在查询中返回的字段数以及索引的选择性。
varchar 字段是从左到右索引的,与字典或百科全书的索引非常相似。
如果您知道该字段的开头(例如 LIKE 'streetname%'),那么索引将是有效的。但是,如果您只知道部分字段(例如 LIKE '%something%'),则不能使用索引。
使用 LIKE 不一定会使用表扫描;它可能会使用索引,具体取决于您要搜索的字符串。(例如,LIKE 'something%' 通常能够使用索引,而 LIKE '%something' 可能不是,尽管在这种情况下服务器可能至少仍然能够进行索引扫描,这比直接索引查找,但仍然比全表扫描便宜。)这里有一篇很好的文章讨论了关于 SQL Server 的 LIKE 与索引(显然,不同的 DBMS 会以不同的方式实现它)。
理论上,数据库将使用最好的索引。你正在使用什么数据库服务器,你真正想要实现什么,你的 LIKE 语句会是什么样子?例如,通配符所在的位置可能会对所使用的查询计划产生影响。
取决于您想要实现的目标的其他可能性是对数据执行一些预处理并拥有对您的搜索有用的其他列,或使用索引视图。
下面是关于在 SQL Server 2005 和 varchar 字段中使用索引的一些讨论。