メンバーがまだレンタルしていない CD を識別する動的クエリを実行しています。NOT IN サブクエリを使用していますが、メンバー テーブルが大きいと非常に遅くなります。クエリを最適化する方法に関する提案
SELECT DVDTitle AS "DVD Title"
FROM DVD
WHERE DVDId NOT IN
(SELECT DISTINCT DVDId FROM Rental WHERE MemberId = AL240);
ありがとう
メンバーがまだレンタルしていない CD を識別する動的クエリを実行しています。NOT IN サブクエリを使用していますが、メンバー テーブルが大きいと非常に遅くなります。クエリを最適化する方法に関する提案
SELECT DVDTitle AS "DVD Title"
FROM DVD
WHERE DVDId NOT IN
(SELECT DISTINCT DVDId FROM Rental WHERE MemberId = AL240);
ありがとう
を使用NOT EXISTS
すると、一致ごとにセット全体を評価するのではなく、「短絡」できるため、パフォーマンスがわずかに向上します。すべてのルールには例外がありますが、少なくとも、NOT IN
またはよりも「悪くない」でしょう。OUTER JOIN
このクエリの書き方は次のとおりです。
SELECT DVDTitle AS [DVD Title]
FROM dbo.DVD AS d
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.Rental
WHERE MemberId = 'AL240'
AND DVDId = d.DVDId
);
実行計画を調査し、インデックスがこのクエリに最適であることを確認することで、パフォーマンスをより最適化できると思います (ワークロードの他の部分に悪影響を与えることはありません)。
また、「 NOT IN、OUTER APPLY、LEFT OUTER JOIN、EXCEPT、または NOT EXISTS を使用する必要がありますか?」も参照してください。
SELECT DVDTitle AS "DVD Title"
FROM DVD d
left outer join Rental r on d.DVDId = r.DVDId
WHERE r.MemberId = 'AL240'
and r.DVDId is null
次の場所にインデックスがあることを確認してください。
d.DVDId
r.DVDId
r.MemberId