基本的にSQLServerがインデックスを自動で選択し、最適な状態でSQLを発行してくれるので、普段は使うことがないとは思います。


が、このインデックスを使って検索条件を処理してほしいってこともあります。


そんな時は次の方法でSQLを発行すれば、インデックスを指定することが可能です。


-- code ------------


SET SHOWPLAN_TEXT ON
GO

select * from Orders where ShippedDate<=getdate()

select * from Orders with(INDEX(ShippedDate)) where ShippedDate<=getdate()

GO

SET SHOWPLAN_TEXT OFF
GO


--------------------


SET SHOWPLAN_TEXT ON

でテキストの実行プランを表示できます。


SET SHOWPLAN_TEXT OFF

で実行プランの表示を無しに戻します。


2つのSELECT文がありますが、withがあるとないとの差があります。


with後のINDEX句でインデックスを指定してます。

(この場合はShippedDateがインデックス名)



実行結果は --------------------


SET SHOWPLAN_TEXT ON
select * from Orders where ShippedDate<=getdate()
|--Clustered Index Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]), WHERE:([Orders].[ShippedDate]<=getdate()))
select * from Orders with(INDEX(ShippedDate)) where ShippedDate<=getdate()
|--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([Northwind].[dbo].[Orders]))
|--Index Seek(OBJECT:([Northwind].[dbo].[Orders].[ShippedDate]), SEEK:([Orders].[ShippedDate] <= getdate()) ORDERED FORWARD)

------------------------------- です。


何も指定していない時はPK_Ordersが利用されてます。


ShippedDateを指定している時は期待通りShippedDateが利用されてます。