2017-08-24 81 views
0

我有简单的选择语句,给我的结果大约一秒钟。但是,如果我添加生成列'Sent to UW on'的子选择语句,那么性能会显着下降。 我想原因是正是这样的说法:在sub 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

你也有两个“L”别名......一个在子选择中,另一个在左边加一个左连接......这最多是令人困惑的。但基本上,该连接不能使用索引,所以它必须转到聚集的主键进行测试。是的,你似乎缺少括号(在AND之后打开,并在ORDER之前关闭)。 – pmbAustin

+0

@丹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 

其内容如下:返回WHERE条件1 2是真正的所有行,或条件3为真。虽然您可能要选择条件1为真,以及条件2 3.如果这是您要表达的意思,您需要将条件2和3封装在括号内。如果这是正确的,你可能会得到一个不同的查询计划。

您有NOLOCK提示渗透您的查询,这告诉我,您可能需要更多的索引在这些表上。

我会检查实际的计划,看看估计是否与实际相符。

+0

括号是罪魁祸首。非常感谢你的解释@Eli – Oleg