如何提高阻止其他用户的查询性能?

时间:2017-05-19 16:46:51

标签: sql-server tsql subquery

我有一个复杂的子选择语句,它会减慢我的查询速度并阻止其他用户。

select 

                (Case when (Select COUNT(*) from tblQuoteDetails QD where QD.QuoteGUID = a.QuoteGUID) > 1 then
                              (SELECT Round(Sum(dbo.tblQuoteOptions.Premium),2)
                              FROM dbo.tblQuotes AS Q 
                                    INNER JOIN dbo.lstQuoteStatus ON Q.QuoteStatusID = dbo.lstQuoteStatus.QuoteStatusID 
                                    INNER JOIN dbo.tblQuoteOptions ON Q.QuoteGUID = dbo.tblQuoteOptions.QuoteGUID 
                                    --INNER JOIN dbo.tblQuoteOptionPremiums ON dbo.tblQuoteOptionPremiums.QuoteOptionGuid = dbo.tblQuoteOptions.QuoteOptionGUID
                              WHERE     (Q.ControlNo = a.ControlNo) 
                                    AND (Q.OriginalQuoteGUID IS NULL) 
                                    AND (dbo.tblQuoteOptions.Premium <> 0)
                                    AND (DATEDIFF(d,ISNULL(null, dbo.GetEffectiveDate(Q.QuoteGUID)), dbo.GetEffectiveDate(Q.QuoteGUID)) <= 0))
                        Else
                              (SELECT     Round(Avg(dbo.tblQuoteOptions.Premium),2)
                              FROM dbo.tblQuotes AS Q 
                                    INNER JOIN dbo.lstQuoteStatus ON Q.QuoteStatusID = dbo.lstQuoteStatus.QuoteStatusID 
                                    INNER JOIN dbo.tblQuoteOptions ON Q.QuoteGUID = dbo.tblQuoteOptions.QuoteGUID 
                                    --INNER JOIN dbo.tblQuoteOptionPremiums ON dbo.tblQuoteOptionPremiums.QuoteOptionGuid = dbo.tblQuoteOptions.QuoteOptionGUID
                              WHERE     (Q.ControlNo = a.ControlNo) 
                                    AND (Q.OriginalQuoteGUID IS NULL) 
                                    AND (dbo.tblQuoteOptions.Premium <> 0)
                                    AND (DATEDIFF(d,ISNULL(null, dbo.GetEffectiveDate(Q.QuoteGUID)), dbo.GetEffectiveDate(Q.QuoteGUID)) <= 0))
                              --GROUP BY dbo.tblQuoteOptions.QuoteOptionID
                       End) As QuotedPremium
    FROM tblQuotes a

不确定我是否正确阅读执行计划,但这就是我所看到的: enter image description here

我知道应该采取什么方法?

由于

2 个答案:

答案 0 :(得分:1)

在无法访问您的环境的情况下完全查看查询并不会非常有效,但我可以肯定地说,Key Looks很昂贵,并且通常可以通过确保您从中获取的列来消除联接表在正在使用的索引中是INCLUDEd。考虑到两个关键查找,我们可以达到查询成本的近80%,我就从那里开始。

答案 1 :(得分:0)

此外,部分问题是在WHERE子句中使用DATEDIFF。

AND (DATEDIFF(d,ISNULL(null, dbo.GetEffectiveDate(Q.QuoteGUID))dbo.GetEffectiveDate(Q.QuoteGUID)) <= 0))

这将严重阻碍优化器完成它的工作。简化这种特殊的比较可能会产生很大的不同。