2017-05-19 47 views
0

我有複雜的子選擇語句,減慢我的查詢,並阻止其他用戶。如何提高阻止其他用戶的查詢性能?

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

任何想法什麼辦法嗎?

感謝

+0

你認爲你可以使用[臨時表格](http://stackoverflow.com/questions/16767645/why-is-there-a-huge-performance-difference-between-temp-table-and-subselect) ? – luisarcher

+0

該查詢中有許多「左邊的中心」。最大的問題是使用標量函數。他們的效率非常低下,你會讓他們到處亂跑。在第一個值爲空的情況下,您完全沒有意義的isnull函數。你也可能想看一看這篇文章。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

+0

注意:使用GUID而不是複合索引是一個可怕的戰略。特別是如果你應用聚簇索引。不要這樣做!它不會擴展並會破壞插入,更新和刪除操作頻繁的系統的性能。 – dbbri

回答

1

展望查詢完全無需訪問您的環境不會非常有效的,但我可以肯定地說,鍵查找是昂貴的,通常可以通過確保你的列被淘汰從正在使用的索引中包含INCLUDEd。考慮到兩個關鍵的查找,我們可以達到幾乎查詢成本的80%,我會從那裏開始。

0

另外,問題的一部分是在WHERE子句中使用DATEDIFF。

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

這會嚴重阻礙優化器完成它的工作。簡化這種特定的比較可能會產生很大的差異。