2

SQLクエリスクリプトのパフォーマンスを改善していました。例えば:

SELECT * 
FROM Book b, Library l, [Order] o 
WHERE o.bookid = b.bookID 
AND o.mode = 'A' 
AND o.library_ID = l.library_ID 
AND l.library_ID > 19 
AND b.publisher_id  > 1000 
AND b.print_id > 800 
AND NOT EXISTS (
  SELECT * 
  FROM ExtBOOK 
  WHERE b.bookid = extbookid 
  AND library_ID = l.library_ID
) 
AND o.activated = 'Y' 
AND b.eisbn13 LIKE '978%' 
AND len(o.ext_user_id) > 3 
AND b.bookid > 200000 
AND b.bookid in (
  SELECT bookid 
  FROM category 
  WHERE categoryid  > 2
) 
ORDER BY o.orderid DESC

SQL Management Studioで「実際の実行プランを含める」を使用してこのSQLスクリプトを検索すると、以下のインデックスを追加するように求められます。

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Order] ([MODE],[ACTIVATED],[LIBRARY_ID],[BOOKID])
INCLUDE ([OrderID],[EXT_USER_ID],[APPROVAL_DATE])

ただし、以下のようないくつかのwhere条件を削除すると、次のようになります。

SELECT * FROM Book b, Library l, [Order] o 
WHERE o.bookid = b.bookID 
AND o.mode = 'A' 
AND o.library_ID = l.library_ID 
AND l.library_ID > 19 
ORDER BY o.orderid DESC

以下のような別の推奨事項があります。

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[ORDER] ([MODE])
INCLUDE ([LIBRARY_ID],[BOOKID])

条件は可変なので、どのインデックスを作成する必要がありますか?インデックスが何をするかは理解していますが、インデックスが付けられているフィールドと含まれているフィールドの間の利点はわかりません。最初の推奨インデックスでBOOKIDとLIBRARY_IDがインデックスフィールドにあるのに、2番目の推奨インデックスでBOOKIDとLIBRARY_IDが含まれているフィールドにあるのはなぜですか?違いは何ですか?また、考えられるすべての条件をカバーするためにどちらを使用する必要がありますか?

また、テストでは、それぞれを追加してパフォーマンスをテストしましたが、違いはわかりません。助けていただければ幸いです。

4

1 に答える 1

1

インデックス作成戦略は、データの予想される変動性にある程度依存します。データが安定していて、めったに更新されない場合は、クエリのパフォーマンスを向上させるためにインデックスを追加できます。ただし、データが揮発性で頻繁に変更される場合は、データが変更されたときにインデックスが再生成されるため、インデックスが増えるとパフォーマンスが低下します。

また、クエリがどの程度予測可能かによっても異なります。予測可能であるか、ストアドプロシージャまたはパラメータ化されたクエリにカプセル化されているか、それとも完全にアドホックであるかによって異なります。

私はあなたがすでにインデックスを持っていると仮定していますOrder.BookIDOrder.Library_ID

さらに、内部結合構文を使用するようにクエリを言い換えます-つまり、次のようになります。

SELECT * 
FROM [Order] o 
     INNER JOIN Library l
          ON o.library_ID = l.library_ID  
     INNER JOIN Book b  
          ON o.bookid = b.bookID 
WHERE 
     o.mode = 'A'  
AND 
     l.library_ID > 19 
于 2012-06-20T12:31:44.473 に答える