使用通配符搜索并返回特定列时,索引是如何工作的



因此,在SQL Server中,我有一个表示账簿记录的表。类似的东西

No   title                type        publisher       etc...
------------------------------------------------------
118  'Book Title'         book        'publisher_1'
119  'Title'              book        'publisher_1'
120  'Title but longer'   ebook       'publisher_1'
121  'Book Title I like'  book        'publisher_1'
122  'Title'              ebook       'publisher_1'

我在第0列有预制的聚集索引,并在"标题"列上创建了索引。

这是我想要测试的一个(无论它是否有助于查询(。

因此,当我运行以下查询时,会发生以下情况:

  • 当我想选择"标题"并使用条件where title LIKE %Title%进行搜索时,它会使用和index scan进行搜索(看起来不错(
  • 当我想选择标题和材料并使用条件where title = 'Title'进行搜索时,它会使用index seek进行搜索(这里都很好(
  • 当我想选择标题和材料并使用条件where title LIKE 'Title%进行搜索时,它会使用clustered index scan进行搜索

最后一个我不明白它为什么选择clustered index scan还有为什么它在第一个中选择index seek,因为我读到索引在的开头和结尾都不能使用通配符

如有任何帮助,我们将不胜感激。

使用通配符意味着使用"不等式"比较。这种比较意味着对索引进行扫描。

非聚集索引更适合进行相等(精确(比较。然后,您可以在执行计划中获得索引查找。

您应该明确地将列"Title"添加到聚集索引中。在你的执行计划中,你应该注意到一些改进,尽管你可能还有索引扫描。聚类索引(单段表(更有效地进行不等式比较(范围比较或通配符比较(

sql引擎可能更喜欢聚集索引扫描,而存在非聚集索引,因为它认为它更高效。

最新更新