質問
データベースに行が存在するかどうかを確認する必要があります。しかし、私は最高のパフォーマンスを提供するこれを行う方法を見つけようとしています。これは例を挙げて最もよく要約されています。
次の表があるとしましょう: ジェネラコディセタグプレ
このテーブルには数百万の行があると想定しますが、インデックスを持つのは列Company
のみです。
FirstName
、LastName
、Company
の特定の組み合わせが存在するかどうかを知りたいです。私はこれができることを知っています:
ジェネラコディセタグプレ
ただし、私が間違っていない限り、全表スキャンが実行されます。
私が本当にやりたいのは、インデックスを利用するクエリです。上記の表を見ると、次のクエリはインデックスを使用しているため、優れたパフォーマンスを発揮することがわかります。 ジェネラコディセタグプレ
そのデータのサブセットのみを検索する方法はありますか?例えばこのようなもの: ジェネラコディセタグプレ
そうすれば、はるかに狭いデータのコレクションに対してのみテーブルスキャンを実行することになります。
上記のクエリが機能しないことはわかっていますが、機能するクエリはありますか?
ああ、ユーザーには読み取りアクセスしかできないため、一時テーブルを作成できません。
解決
IF EXISTS( ...)
が最速の形式です。オプティマイザーは、インデックスが高速になると計算した場合、フィルター条件を満たすために使用可能なインデックスを使用します。IF EXISTS
は、行が見つかるとすぐに終了します。
統計が最新であることを確認してください...
他のヒント
FWIW、これは有効なSQLです: ジェネラコディセタグプレ
そして、エイリアスだけがクエリと異なります。ミッチが彼の投稿で述べているように、IF EXISTS
はより速くなります。
クエリアナライザを使用して、オプティマイザが何を行うかを決定できます。