web-dev-qa-db-ja.com

SELECTステートメントでインデックスを使用する方法は?

従業員テーブルで、テーブルのemp_name列にインデックス(idx_name)を作成したとしましょう。

Select句でインデックス名を明示的に指定する必要がありますか、それはクエリを高速化するために自動的に使用されます。

選択句で指定する必要がある場合、選択クエリでインデックスを使用するための構文は何ですか?

79
Vivek

インデックスをテストして機能するかどうかを確認する場合は、次の構文を使用します。

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITHステートメントは、インデックスの使用を強制します。

75
Jason

良い質問、

通常、DBエンジンは、構築するクエリ実行プランに基づいて、使用するインデックスを自動的に選択する必要があります。ただし、DBが特定のインデックスを使用するように強制する場合、いくつかの非常にまれなケースがあります。

特定の質問に答えられるようにするには、使用しているDBを指定する必要があります。

MySQLの場合、これを行う方法に関する Index Hint Syntax ドキュメントを読む必要があります。

32

selectステートメントでインデックスを使用する方法は?
こちらです:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

さらに多くの方法で this をチェックします

明示的に指定する必要がありますか?

  • いいえ、明示的に指定する必要はありません。
  • DBエンジンは、@ Tudor Constantin answerから構築したクエリ実行プランに基づいて、使用するインデックスを自動的に選択する必要があります。
  • オプティマイザーは、インデックスの使用がクエリの実行を高速化するかどうかを判断し、実行される場合はインデックスを使用します。 @niktrl回答から
25
VdeX

generalでは、インデックスの使用に想定されるコストが発生し、さらにブックマーク検索を実行する必要がある場合、テーブル全体をスキャンするだけのコストよりも低い場合にインデックスが使用されます。

クエリが次の形式の場合:

SELECT Name from Table where Name = 'Boris'

また、1000のうち1行にはBorisという名前があり、ほぼ確実に使用されます。全員の名前がBorisである場合、インデックスはデータにアクセスするためのより効率的な戦略になる可能性が低いため、おそらくテーブルスキャンに頼るでしょう。

幅の広いテーブル(多くの列)で、次の場合:

SELECT * from Table where Name = 'Boris'

その後、名前を検索するよりもテーブルから他の列を取得するのに時間がかかるという合理的な仮定の場合、または再び検索する可能性がある場合は、テーブルスキャンを実行することを選択できますとにかくたくさんの行。

13

オプティマイザーは、インデックスの使用がクエリの実行を高速化するかどうかを判断し、実行される場合はインデックスを使用します。

RDBMSによっては、インデックスの使用を強制できますが、何をしているのかわからない場合はお勧めできません。

一般に、テーブル結合およびwhereステートメントで使用する列にインデックスを付ける必要があります

9
niktrs

一般的に、テーブルにインデックスを作成すると、データベースはそのテーブル内のデータを検索するときに自動的にそのインデックスを使用します。それについて何もする必要はありません。

ただし、MSSQLでは、index hintを指定して、特定のインデックスを使用してこのクエリを実行することを指定できます。これについての詳細は here をご覧ください。

Index hintMySQL でも利用できるようです。チューダーコンスタンティンに感謝します。

5
MD Sayem Ahmed

条件内でインデックスが適用される列を使用すると、自動的に含まれます。使用する必要はありませんが、使用するとクエリが高速化されます。

SELECT * FROM TABLE WHERE attribute = 'value'

適切なインデックスを使用します。

3
ChrisBint

インデックスヒントは、Microsoft Dynamicsデータベースサーバーでのみ使用できます。従来のSQL Serverの場合、「Where」句で定義したフィルターは、関連するインデックスを使用するようにエンジンを説得する必要があります... )-組み込みのパフォーマンスオプティマイザーの一部として、適切なステートメントを実行する前に2つを比較する必要があります。

ただし、次のようなものを使用してオプティマイザーにスキャンを強制することができます

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

または、次のようなものを使用して特定のインデックスを探す

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

選択はあなた次第です。オブジェクトパネルでテーブルのインデックスプロパティを見て、使用するインデックスのアイデアを取得します。フィルターと一致する必要があります。

最良の結果を得るには、最初に最も少ない結果を返すフィルターをリストします。私が言っていることが正しいかどうかはわかりませんが、クエリフィルターは連続しているようです。シーケンスが正しい場合、オプティマイザーはすべての組み合わせを比較してそれを行う必要はありません。少なくとも、より高価なクエリとの比較を開始しないでください。

1
Cory