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


97

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

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

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

回答:


86

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

SELECT *
FROM Table WITH(INDEX(Index_Name))

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


82
この投稿は質問の答えにはなりません。つまり、クエリでインデックスを指定する必要はありません。自動的に使用されます(または使用されません)。ただし、強制することはできます。詳細(いつ、なぜこれを行うか)は、以下の他の投稿にあります。
2014

34

良い質問、

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

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

MySQLの場合、これを行う方法に関するインデックスヒント構文のドキュメントを読みたい


30

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);

そして、もっと多くの方法がこれをチェックします

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

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

13

一般的なインデックスを使用し、次いでおそらくはさらにブックマークルックアップを実行する必要の想定コストは単にテーブル全体をスキャンするコストよりも低い場合、インデックスが使用されます。

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

SELECT Name from Table where Name = 'Boris'

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

幅の広いテーブル(たくさんの列)で、次のようにした場合:

SELECT * from Table where Name = 'Boris'

その後、名前を検索するよりもテーブルから他の列を取得するのに時間がかかることが合理的な前提である場合、または、とにかく行がたくさん。


9

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

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

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


5

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

SELECT * FROM TABLE WHERE attribute = 'value'

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


5

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

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

Index hintMySQLでも利用できるようです。Tudor Constantineに感謝します。


1

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

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

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.