具有like和where模式的列的索引?

Reg*_*ser 5 sql sql-server sql-server-2008 sql-server-2008-r2

我得出这样的结论,就像在下面的情况下确实寻找/扫描但我没有得到为什么它在第一种情况下扫描并在第二种情况下寻求.我理解第三种情况.

SELECT c.contactname FROM Sales.Customers c
WHERE c.contactname LIKE '%a'-- Does a Scan 1st Case

SELECT c.contactname FROM Sales.Customers c
WHERE c.contactname LIKE 'a%'-- Does a Seek 2nd Case

SELECT c.contactname FROM Sales.Customers c
WHERE c.contactname LIKE '%a%'-- Does a Scan
Run Code Online (Sandbox Code Playgroud)

如果我在contactname上建立一个索引,该索引具有以下样本数据,那么索引树将如何...就像我们为数字构建它将比较小于大于并且将遍历索引树将在下面的情况下遍历的方式.

c.contactname

mark
anna
krishna
nadejda
allen
bob
cab
Run Code Online (Sandbox Code Playgroud)

Eso*_*ame 4

它在第一种情况下执行扫描的原因与第三种情况相同:索引根据字符串开头的数据进行搜索。如果模式开头有通配符,则无法智能地在索引中搜索匹配项。该索引对字符串进行词法(字母顺序)比较,这是小于/大于比较。

这棵树可能看起来像这样:

        /nadejda
    mark
   /    \krishna
cab
   \    /bob
    anna
        \allen
Run Code Online (Sandbox Code Playgroud)

因此,搜索a%是可以完成的,因为索引会知道每个分支的去向。例如,C > A,所以向左走。%a无法有效地进行搜索。索引必须读取所有数据才能确定每个节点是否以 A 结尾。必须读取所有数据意味着使用索引只是浪费开销。