1

INNER JOINいくつかのサブクエリを実行しているクエリがあります。このクエリでは、ステートメントWHEREを持つ同様の句を使用します。.LIKEWHERE bookName LIKE '%INTERVIEWS%'

bookNameしかし、「INTERVIEWS」という単語を持つa には、約 5 つの異なるバリエーションがあります。ORでは、バリエーションごとに 1 つのステートメントを実行した場合、クエリのパフォーマンスが向上するでしょLIKEうか?それとも、すべてのバリエーションに対して 1 つのステートメントを実行する必要があるでしょうか?

- - - - - - - - - 編集 - - - - - - - - -

LIKEステートメントのみを使用したクエリの例を次に示します。

SELECT 
   *
FROM 
   books
WHERE
   bookName LIKE '%INTERVIEWS%';

ORステートメントを使用したクエリの例を次に示します。

SELECT 
   *
FROM 
   books
WHERE
   bookName = 'INTERVIEWS WITH CELEBRITIES'
   OR
   bookName = 'ONGOING INTERVIEWS WITH STUDENTS'
   OR
   bookName = 'POLITICIAN INTERVIEWS'
   OR
   bookName = 'INTERVIEWS WHICH FAILED'
   OR
   bookName = 'INTERVIEWS WITH PROGRAMMERS';
4

3 に答える 3

3

考慮すべき複数の側面があります。

  • bookName 列にがありませindexん。このコンテキストでは問題ありません。クエリは、クラスター化インデックス スキャンまたはテーブル スキャンを実行することによって同じように実行されます。
  • bookNamenon clustered index列に
    • これはnon covering index(シナリオ 1) です。ORステートメントを使用した 2 番目の使用例でindex tipping pointは、クエリ オプティマイザーがを使用しないnon clustered indexと決定する にヒットする可能性があります。このコンテキストではLIKE、インデックス スキャンを使用するとパフォーマンスが向上します。詳細については、Kimberly Tripp のブログをご覧ください。
    • これはcovering index(シナリオ 2) です。インデックスをカバーするための転換点はありません。この場合、2 番目のクエリは、クエリがまだ を実行する必要があるindex seek場所でを使用することにより、大幅にパフォーマンスが向上します。LIKEIndex Scan

したがって、パフォーマンスが重要な場合は、カバリング インデックスを使用します

Adventure Worksを使用した詳細は次のとおりです。

シナリオ 1

SELECT  *
FROM    Production.Product AS p
WHERE   Name LIKE '%mountain seat%'

SELECT  *
FROM    Production.Product AS p
WHERE   Name = 'LL Mountain Seat Assembly'
        OR Name = 'ML Mountain Seat Assembly'
        OR Name = 'HL Mountain Seat Assembly'
        OR Name = 'LL Mountain Seat/Saddle'
        OR Name = 'ML Mountain Seat/Saddle'
        OR Name = 'HL Mountain Seat/Saddle'

ここに画像の説明を入力

シナリオ 2

SELECT  Name
FROM    Production.Product AS p
WHERE   Name LIKE '%mountain seat%'

SELECT  Name
FROM    Production.Product
WHERE   Name = 'LL Mountain Seat Assembly'
        OR Name = 'ML Mountain Seat Assembly'
        OR Name = 'HL Mountain Seat Assembly'
        OR Name = 'LL Mountain Seat/Saddle'
        OR Name = 'ML Mountain Seat/Saddle'
        OR Name = 'HL Mountain Seat/Saddle'

ここに画像の説明を入力

于 2012-11-27T22:45:57.297 に答える
0

bookName 列がインデックス化されていて、テーブルにかなりの数の列がある場合、テーブル スキャンではなくインデックス スキャンになるため、2 番目のオプションの方が確実に高速に実行されます。インデックスがない場合は、どちらもテーブル スキャンが必要になるため、ほぼ同じになります。

全文索引を追加するという考えについては、このような短い名前ではなく、テキストの長い列に最適です。パフォーマンスが必要な場合は、列にインデックスを付け、一連の完全一致を行うことに固執します。

于 2012-11-27T21:22:30.283 に答える