2012-06-17 5 views
2

AdventureWorks2012 데이터베이스를 사용하고 있습니다.쿼리 최적화 프로그램이 인덱스 검색보다 인덱스 스캔을 선호합니다.

select 
    PurchaseOrderNumber, 
    OrderDate, 
    ShipDate, 
    SalesPErsonId 

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

내가있는 모든 열로, 인덱스가 아닌 인덱스 스캔을 추구 기대 :

은 내가 아래 쿼리를 실행하면 Sales.SalesOrderHeader 테이블

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

을에서 다음 인덱스를 생성 쿼리의 일부가 이미 인덱스의 일부입니다.

쿼리 최적화 프로그램이 인덱스 검색보다 비용이 저렴하다고 느낀다면 scan을 인덱싱합니다. 그러나이 경우 왜 발생하는지 이해할 수 없습니다. 우리는 전혀 조회하지 않습니다.

누군가 나를 설명해 주시겠습니까?

답변

1

색인은 전화 번호부와 동일하게 작동합니다. 전화 번호부에서 %po5%을 어디에서 찾으십니까? 첫 번째 문자를 모르기 때문에 전체 전화 번호부를 읽어야합니다.

그래서 SQL Server가 전체 인덱스를 검색합니다. 그것은 찾기에 충분한 정보가 없습니다.

+0

설명해 주셔서 감사합니다. 첫 번째 %를 제거하는 순간 작동을 시작합니다. –