我有複雜的子選擇語句,減慢我的查詢,並阻止其他用戶。如何提高阻止其他用戶的查詢性能?
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
不知道如果我正確讀取執行計劃,但是這就是我看到的:我應該採取
任何想法什麼辦法嗎?
感謝
你認爲你可以使用[臨時表格](http://stackoverflow.com/questions/16767645/why-is-there-a-huge-performance-difference-between-temp-table-and-subselect) ? – luisarcher
該查詢中有許多「左邊的中心」。最大的問題是使用標量函數。他們的效率非常低下,你會讓他們到處亂跑。在第一個值爲空的情況下,您完全沒有意義的isnull函數。你也可能想看一看這篇文章。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –
注意:使用GUID而不是複合索引是一個可怕的戰略。特別是如果你應用聚簇索引。不要這樣做!它不會擴展並會破壞插入,更新和刪除操作頻繁的系統的性能。 – dbbri