我有一个动态查询,它运行识别成员尚未租用的 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