2012-06-17 86 views
2

我正在使用AdventureWorks2012数据库。查询优化器偏好索引扫描查找索引

我创建了下面的指数Sales.SalesOrderHeader

create index i1 on 
sales.salesorderheader(purchaseordernumber,salespersonid) 
    include(orderdate,shipdate) 
    where purchaseordernumber is not null 
    and salespersonid is not null 

当我运行下面的查询:

select 
    PurchaseOrderNumber, 
    OrderDate, 
    ShipDate, 
    SalesPErsonId 

from sales.salesorderheader 
where purchaseordernumber like '%po5%' and salespersonid is not null 

我想到一个索引查找没有索引扫描,因为所有这些都列部分查询已经是索引的一部分。

我在某处读到,如果查询优化器认为索引扫描比索引查找便宜,那么我们将索引扫描。 但是,我不明白为什么在这种情况下发生。我们根本没有查询。

有人可以解释我吗。

回答

1

索引就像电话簿一样工作。你会在电话簿中寻找%po5%?你必须阅读整个电话簿,因为你不知道第一个字符。

这就是SQL Server扫描整个索引的原因。它没有足够的信息来寻找。

+0

非常感谢澄清。当我删除第一个%时,它开始工作。 –