2012-06-17 112 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

非常感謝澄清。當我刪除第一個%時,它開始工作。 –