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 回答