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%電話帳のどこを探しますか?最初の文字がわからないので、電話帳全体を読む必要があります。

これが、SQLServerがインデックス全体をスキャンする理由です。探すのに十分な情報がありません。

于 2012-06-17T12:52:33.087 に答える