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

我希望索引查找不是索引扫描,因为作为查询一部分的所有列都已经是索引的一部分。

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

有人可以解释一下吗。

4

1 回答 1

1

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

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

于 2012-06-17T12:52:33.087 回答