Sql server 2008 优化此查询

Sql server 2008 优化此查询,sql-server-2008,query-optimization,Sql Server 2008,Query Optimization,ms sql server 2008 SELECT Action.* FROM Mailing INNER JOIN ActionCategoryMailingBunch ON Mailing.MailingID = ActionCategoryMailingBunch.MailingID INNER JOIN ActionCategory ON ActionCategoryMailingBunch.ActionCat

ms sql server 2008

SELECT Action.* 
FROM   Mailing 
       INNER JOIN ActionCategoryMailingBunch 
         ON Mailing.MailingID = ActionCategoryMailingBunch.MailingID 
       INNER JOIN ActionCategory 
         ON ActionCategoryMailingBunch.ActionCategoryID = 
            ActionCategory.ActionCategoryID 
       INNER JOIN Action 
         ON ActionCategory.ActionCategoryID = Action.ActionCategoryID 
WHERE  ( Mailing.MailingID = 7 ) 
       AND ( Mailing.MailingID NOT IN (SELECT MailingID 
                                       FROM   MailingReport) ) 
       AND ( Action.ActionID NOT IN (SELECT ActionID 
                                     FROM   MailingReport) ) 
       AND ( ActionCategoryMailingBunch.MailingBunchStatusID = 4 )  

尤其是这个街区

(Mailing.MailingID NOT IN (SELECT MailingID FROM  MailingReport)) 
AND (Action.ActionID NOT IN (SELECT ActionID FROM  MailingReport))

在select语句中添加以下代码

Left Join MailingReport MR on MR.ActionID = Mailing.MailingID
在Where子句中添加以下代码

(MR.ActionID is null)
由于以下阻塞导致性能升级

(Mailing.MailingID NOT IN (SELECT MailingID FROM  MailingReport)) 
最终查询

SELECT Action.* 
FROM   Mailing 
       INNER JOIN ActionCategoryMailingBunch 
         ON Mailing.MailingID = ActionCategoryMailingBunch.MailingID 
       INNER JOIN ActionCategory 
         ON ActionCategoryMailingBunch.ActionCategoryID = 
            ActionCategory.ActionCategoryID 
       INNER JOIN Action 
         ON ActionCategory.ActionCategoryID = Action.ActionCategoryID 
         Left Join MailingReport MR on MR.ActionID = Mailing.MailingID
WHERE  ( Mailing.MailingID = 7 ) 
       --AND ( Mailing.MailingID NOT IN (SELECT MailingID 
       --                                FROM   MailingReport) ) 
       AND
       (MR.ActionID is null)
       AND ( Action.ActionID NOT IN (SELECT ActionID 
                                     FROM   MailingReport) ) 
       AND ( ActionCategoryMailingBunch.MailingBunchStatusID = 4 ) 
类似地,可以对第二个块执行此操作 由于第二次阻塞而导致的性能下降

AND (Action.ActionID NOT IN (SELECT ActionID FROM  MailingReport))
两个块的最终查询

SELECT Action.* 
FROM   Mailing 
       INNER JOIN ActionCategoryMailingBunch 
         ON Mailing.MailingID = ActionCategoryMailingBunch.MailingID 
       INNER JOIN ActionCategory 
         ON ActionCategoryMailingBunch.ActionCategoryID = 
            ActionCategory.ActionCategoryID 
       INNER JOIN Action 
         ON ActionCategory.ActionCategoryID = Action.ActionCategoryID 
         Left Join MailingReport MR on MR.ActionID = Mailing.MailingID
         Left Join MailingReport MRA on MRA.ActionID = Action.ActionID
WHERE  ( Mailing.MailingID = 7 ) 
       AND
       (MR.ActionID is null)
       AND
       (MRA.ActionID is null)
       AND ( ActionCategoryMailingBunch.MailingBunchStatusID = 4 ) 

如果这是您在语义上需要的,那么不确定您希望我们对您的查询做什么!如果您有性能问题,请发布所有相关表(包括索引)的执行计划和定义。虽然您仅从
操作
中选择列,但您可能希望使用
存在
而不是
加入
过去我的查询也有类似的问题。以上是解决问题的纠正措施。据我所知,In查询在内部充当一个循环,我在这里避免它。这是我过去的经验。