Sql server 不在子查询优化中

Sql server 不在子查询优化中,sql-server,Sql Server,我有一个动态查询,用于识别成员尚未租用的CD。我正在使用NOT IN子查询,但是当我有大的成员表时,它会使它们非常慢。有没有关于如何优化查询的建议 SELECT DVDTitle AS "DVD Title" FROM DVD WHERE DVDId NOT IN (SELECT DISTINCT DVDId FROM Rental WHERE MemberId = AL240); 谢谢使用NOT EXISTS会有稍微好一点的性能,因为它可以“短路”,而不是评估每场比赛的整个集合

我有一个动态查询,用于识别成员尚未租用的CD。我正在使用NOT IN子查询,但是当我有大的成员表时,它会使它们非常慢。有没有关于如何优化查询的建议

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

谢谢

使用
NOT EXISTS
会有稍微好一点的性能,因为它可以“短路”,而不是评估每场比赛的整个集合。至少,它不会比
不在
外部连接
中“更糟糕”,尽管每个规则都有例外。以下是我将如何编写此查询:

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
  );
我想,通过调查执行计划并确保索引最适合此查询(不会对工作负载的其他部分造成负面影响),可以更好地优化性能


另请参见

使用<代码>不存在将有稍好的性能,因为它可以“短路”,而不是评估每场比赛的整个集合。至少,它不会比
不在
外部连接
中“更糟糕”,尽管每个规则都有例外。以下是我将如何编写此查询:

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
  );
我想,通过调查执行计划并确保索引最适合此查询(不会对工作负载的其他部分造成负面影响),可以更好地优化性能

也看到

确保您在以下各项上具有索引:

d.DVDId
r.DVDId
r.MemberId 
确保您在以下各项上具有索引:

d.DVDId
r.DVDId
r.MemberId 

什么是表定义,包括列可空性和索引?您是否在
rent(MemberID,DVDId)
上有索引?请提供更多信息,如行数、索引等。哪些表定义包括列可空性和索引?您是否在
rent(MemberID,DVDId)上有索引
?提供更多信息,如行数、索引等。如果
DVDId
列都不可为空,我希望
不在
不存在
有相同的计划。如果其中一个可以为空,则
不在@MartinSmith版本中是的,但请注意,我还删除了
不同的
如果您不确定,则默认为不总是存在。它几乎总是反连接的最佳选择。如果
DVDId
列都不可为空,我希望
不在
不存在
有相同的计划。如果其中一个可以为空,则
不在@MartinSmith版本中是的,但请注意,我还删除了
不同的
如果您不确定,则默认为不总是存在。它几乎总是反连接的最佳选择。@K-Seeker出于好奇,您在这里观察到了实际的性能改进吗?嗨,Aaron,有一个显著的改进。我还没有测试过你的suugestion,但我尝试了notexists,它与子查询中的NO没有太大区别。我会随时通知你的。再次感谢。Dan@K-探索者出于好奇,你在这里观察到实际的性能改进了吗?嗨,亚伦,有一个显著的改进。我还没有测试过你的suugestion,但我尝试了notexists,它与子查询中的NO没有太大区别。我会随时通知你的。再次感谢。丹