简体   繁体   中英

Query optimizer prefers index scan over index seek

I am using AdventureWorks2012 database.

I created the following index on Sales.SalesOrderHeader table

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

When I run the below query:

select 
    PurchaseOrderNumber,
    OrderDate,
    ShipDate,
    SalesPErsonId

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

I expect an Index seek not an index scan, as all of the columns which are part of the query are already part of the index.

I read somewhere that if the query optimizer feels that index scan is cheaper than index seek, then we will index scan. But, I don't understand why it's happening in this case. We don't have a lookup at all.

Can someone explain me please.

An index works just like a phonebook. Where would you look for %po5% in a phonebook? You'd have to read the entire phonebook, because you don't know the first character.

That's why SQL Server scans the entire index. It does not have enough information to seek.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM