1

MS SQL Server データベースには、次のフィールドとデータを含むテーブル T があります。

Name |  Begin  |  End
-----------------------
A    |    3    |   6
B    |    2    |   4
C    |    4    |   5
...................

私は通常、次のようなクエリを使用します。

SELECT *
FROM T
WHERE 5 BETWEEN Begin AND End

「Begin」フィールドと「End」フィールドの間に定数 5 を含むレコードを検索します。実行計画は、テーブル全体のスキャンを実行することです。テーブルスキャンを回避するためにテーブル構造とインデックスを設計する方法は? ありがとう!

4

2 に答える 2

2

[名前] を含む [Begin] と [End] に複合インデックスを作成し、クエリから * を削除し、列名に置き換えます

 SELECT name, [begin],[end]
FROM T
WHERE 5 BETWEEN [Begin] AND [End]

これを行う理由は、非クラスタ インデックス シークを 1 回、I/O 読み取りを 1 回だけ実行するためです。クエリ プランをもう一度確認してください。次のようになっているはずです。 Index Seek (Non-cluster index....) 100%

于 2013-03-19T04:36:45.087 に答える
1

存在しない場合は、開始日と終了日の両方を含むインデックスを追加します。

于 2013-03-19T02:20:25.900 に答える