2 つのインデックスを持つテーブルがあります。1 つは、3 列の複数列クラスター化インデックスです。
(
symbolid int16,
bartime int32,
typeid int8
)
2 つ目はクラスタ化されていない
(
bartime int16
)
私が実行しようとしている選択ステートメントは次のとおりです。
SELECT symbolID, vTrdBuy
FROM mvTrdHidUhd
WHERE typeID = 1
AND barDateTime = 44991
AND symbolid in (1010,1020,1030,1040,1050,1060)
SQL Management Studioエディターを使用してsql2008でこのクエリを実行し、実際の実行計画を有効にすると、SQLが2番目のインデックスと提案を使用して、3つの列(symbolid、bartime、typeid)の新しいインデックスを作成することがわかりましたが、クラスター化されていません!!! (すでにクラスター化されたインデックスがあるため、非クラスター化インデックスと言っていると思います)
この選択は間違っています。もう一度同じクエリを再実行し、SQL にクラスタ化されたインデックス ("with index" を使用) を使用させると、パフォーマンスが向上します。
ここで 2 つの質問があります。1 つはこの動作に関連し、もう 1 つはクエリ自体に関するものです。
- SQL が間違ったインデックスを選択し、同じインデックスを提案する理由
"where"
パフォーマンスを向上させるために、条件でどちらを使用する必要がありますか
(1010,1020,1030,1040,1050,1060) のシンボル ID
(symbolid = 1010 または symbolid = 1020 など)
((1010 と 1060) の間の記号)
テスト後
where 条件を IN の使用から >= および <= の使用に変更すると、bartime 列の非クラスター化インデックスは、3 列のクラスター化インデックスよりも優れたパフォーマンスを発揮することがわかりました。
SO WHERE が IN を使用する場合、クラスター化インデックスを使用する方が良い場合が 2 つあります。