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が含まれているフィールドにあるのはなぜですか?違いは何ですか?また、考えられるすべての条件をカバーするためにどちらを使用する必要がありますか?
また、テストでは、それぞれを追加してパフォーマンスをテストしましたが、違いはわかりません。助けていただければ幸いです。