2017-08-24 7 views
0

私は約1秒間私に結果を与える単純な選択ステートメントを持っています。しかし、カラム'Sent to UW on'を生成するsub-select文を追加すると、パフォーマンスが大幅に低下します。 私は理由がまさにこの文であると思う:サブSELECT文を連結すると、クエリのパフォーマンスが大幅に低下します。 SQL 2012

OR L.Action = CONCAT('Conrol #',Q.ControlNo, '. Change Quote Status Reason from ''None'' to ''Under Review''') 

このselect文を書き換えるための他の方法ですか?

SELECT 
    ControlNo , 
    PolicyNumber , 
    l.LineName , 
    InsuredPolicyName , 
    DisplayStatus , 
    U.UserName as Underwriter , 
    u.EmailAddress as 'Underwriter Email' , 
    rtrim(ltrim(PC.[FName])) + ' ' + rtrim(ltrim(PC.[LName])) as Broker , 
    PL.Name , 
    q.DateBound , 
    q.EffectiveDate , 
    ( 
    SELECT TOP 1 L.ActionDate 
    FROM tblLog L 
    WHERE L.IndentifierGuid = q.QuoteGUID 
    AND L.Action = 'Reason for Quote status change: Under Review' 
--The line below slows down the performance 
    OR L.Action = CONCAT('Conrol #',Q.ControlNo, '. Change Quote Status Reason from ''None'' to ''Under Review''') 
    ORDER BY L.ActionDate asc 
    ) as 'Sent to UW on' 
FROM  tblQuotes Q WITH (nolock) 
JOIN  tblUsers U WITH (nolock) ON underwriteruserguid = u.userGUID 
LEFT JOIN lstlines L WITH (nolock) ON L.LineGUID = Q.lineguid 
LEFT JOIN lstQuoteStatusReasons QSR WITH (nolock) ON QSR.ID = Q.QuoteStatusReasonID 
LEFT JOIN [MEJAMES].[dbo].[tblProducerContacts] PC WITH (nolock) ON pc.ProducerContactGUID = q.ProducerContactGuid 
LEFT JOIN MEJAMES.DBO.tblProducerLocations PL WITH (nolock) ON PC.ProducerLocationGUID = PL.ProducerLocationGUID 
LEFT JOIN [MEJAMES].[dbo].[tblProducerContacts] PC_Asst WITH (nolock) ON PC_Asst.ProducerContactGUID = q.SecProducerContactGuid 
WHERE  q.lineGUID in('D4983D4A-1D12-461D-8837-6092DC74325B', 'CF144437-F128-4B77-AC19-877247347D02' , 'E05E7F4A-07C4-4981-BD13-2461D4EE4BF3') 
    /* EQ and Wind and Terrorism LOBs */ 
    AND q.OriginalQuoteGUID is null 
    AND Q.QuoteStatusID = 3 
    AND Q.EffectiveDate > '5-1-2017' 
ORDER BY q.ControlNo 

私の推定実行プランの作品:

enter image description here

+2

括弧がありませんか? 'OR'述語は前の' L.IndentifierGuid = q.QuoteGUID'とは独立しています。 –

+0

あなたはまた、2つの "L"エイリアスを持っています...サブセレクトに1つと、それ以外にLEFT JOINとして1つ...最高で混乱します。しかし基本的には、その連結では索引を使用できないため、クラスター化された主キーに移動してテストを実行する必要があります。そして、ええ、括弧がなくなっているようです(ANDの後に開き、ORDERの前に閉じてください)。 – pmbAustin

+0

@Dan Guzmanあなたは正しいです。括弧がその仕事をしました。どうもありがとうございました! – Oleg

答えて

1

私が間違ってここにいくつかのことを参照してください - それはあなたを助ける必要があります対処します。
Dan Guzmanの(仮の)欠落括弧のコメントには問題があります。
あなたがしている(ナンバリング鉱山):次のように読み込む

WHERE L.IndentifierGuid = q.QuoteGUID --1 
    AND L.Action = 'Reason for Quote status change: Under Review' --2 
--The line below slows down the performance 
    OR L.Action = CONCAT('Conrol #',Q.ControlNo, '. Change Quote Status Reason from ''None'' to ''Under Review''') --3 

は:条件1 2に該当するすべての行を返す、または条件3が真です。あなたはおそらく、条件1が真である条件と条件2のいずれかと同様に選択することを意味していました。3.これがあなたが表現しようとしているものであれば、条件2と3をかっこで囲む必要があります。これが正しい場合は、別のクエリプランを取得する可能性があります。

ヒントがクエリに浸透しているため、これらのテーブルでさらにインデックスを作成する必要がある可能性があります。

実際の見積もりが実績と同レベルかどうかを確認します。

+0

括弧が原因です。 @Eliの説明をありがとう – Oleg

関連する問題