2017-05-19 7 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

そのクエリには「中心の左」というものがたくさんあります。最大の問題は、スカラ関数の使用です。彼らはひどく非効率的で、あなたはそれらをどこにでも散らばっています。最初の値がnullの場合は、無意味な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

、私は無事にキールックアップが高価であり、多くの場合、あなたがしている列を確保することによって排除することができると言うことができます結合された表からの取得は、使用されている索引にINCLUDEされます。 2つの主要なルックアップを考慮すると、クエリコストのほぼ80%に達することができます。私はそこから始めます。

0

また、問題の一部は、WHERE句内のDATEDIFFの使用です。

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

これは、オプティマイザの仕事を著しく妨げることになります。この特定の比較を単純化することで大きな違いが生まれる可能性があります。

関連する問題