web-dev-qa-db-ja.com

SQL Server:同様に使用されるインデックス列?

LIKE演算でのみ使用されるvarchar列にインデックスを付けるのは良い考えですか?クエリ分析から読み取れるものから、次のクエリから取得します。

SELECT * FROM ClientUsers WHERE Email LIKE '%niels@bosmainter%'

「推定サブツリーコスト」はインデックスなしで0.38、インデックスありで0.14になります。クエリがインデックスで最適化されている場合、これは分析に使用するのに適したメトリックですか?

39
Niels Bosma

「abcdefg」というデータが与えられた

WHERE Column1 LIKE '%cde%'  --can't use an index

WHERE Column1 LIKE 'abc%' --can use an index

WHERE Column1 Like '%defg' --can't use an index, but see note below

注: '%defg'を必要とする重要なクエリがある場合は、永続的な計算列を使用して、列をREVERSE()してからインデックスを付けることができます。次に、次のクエリを実行できます。

WHERE Column1Reverse Like REVERSE('defg')+'%' --can use the persistent computed column's index
73
KM.

私の経験では、最初の%記号はインデックスを役に立たなくしますが、最後の1つはインデックスを使用します。

12
idstam

質問のメトリックスの部分に答えるには:実行されているインデックス/テーブルスキャン/シークのタイプは、インデックスが(適切に)使用されているかどうかを知るための良い指標です。通常、クエリプランアナライザーの一番上に表示されます。

次のスキャン/シークタイプは、最悪から(上)から最高にソートされています)(下):

  • テーブルスキャン
  • クラスター化インデックススキャン
  • インデックススキャン
  • クラスター化インデックスシーク
  • インデックスシーク

経験則として、通常は可能な限りスキャンよりもシークを試みるようにします。いつものように、テーブルのサイズ、クエリされた列などに応じて例外があります。「スキャンシークインデックス」に対して StackOverflowで検索 を実行することをお勧めします。 。

7
MicSim