Sql server 2008 优化此查询
ms sql server 2008Sql 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
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查询在内部充当一个循环,我在这里避免它。这是我过去的经验。