1

メンバーがまだレンタルしていない CD を識別する動的クエリを実行しています。NOT IN サブクエリを使用していますが、メンバー テーブルが大きいと非常に遅くなります。クエリを最適化する方法に関する提案

SELECT DVDTitle AS "DVD Title" 
FROM DVD 
WHERE DVDId NOT IN 
    (SELECT DISTINCT DVDId FROM Rental WHERE MemberId = AL240);

ありがとう

4

2 に答える 2

6

を使用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 を使用する必要がありますか?」も参照してください。

于 2012-09-14T14:23:33.567 に答える
5
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 
于 2012-09-14T14:24:22.890 に答える