为什么从同一个表中选择特定列会显着降低查询性能?

问题描述 投票:0回答:1

我有

SELECT
语句,从
tblQuotes
查询列。为什么如果我选择列
a.ProducerCompositeCommission
a.CompanyCompositeCommission,
然后查询永远旋转。

有和没有这些列的执行计划是相同的!

如果我将它们注释掉 - 那么它会带来 1 秒的结果。

SELECT 
    a.stateid risk_state1,
    --those columns slows down performance 
    a.ProducerCompositeCommission,
    a.CompanyCompositeCommission,
    GETDATE() runDate
FROM
    tblQuotes a 
INNER JOIN
    lstlines l ON a.LineGUID = l.LineGUID
INNER JOIN 
    tblSubmissionGroup  tsg ON tsg.SubmissionGroupGUID = a.SubmissionGroupGuid
INNER JOIN  
    tblUsers u ON u.UserGuid = tsg.UnderwriterUserGuid 
INNER JOIN  
    tblUsers u2 ON u2.UserGuid = a.UnderwriterUserGuid  
LEFT OUTER JOIN   
    tblFin_Invoices tfi ON tfi.QuoteID = a.QuoteID AND tfi.failed <> 1     
INNER JOIN 
    lstPolicyTypes lpt ON lpt.policytypeid = a.policytypeid
INNER JOIN 
    tblproducercontacts prodC ON prodC.producercontactguid = a.producercontactguid
INNER JOIN 
    tblProducerLocations pl ON pl.producerlocationguid = prodc.producerlocationguid
INNER JOIN 
    tblproducers prod ON prod.ProducerGUID = pl.ProducerGUID
LEFT OUTER JOIN  
    Catalytic_tbl_Model_Analysis aia ON aia.ImsControl = a.controlno 
                                     AND aia.analysisid = (SELECT TOP 1 tma2.analysisid 
                                                           FROM Catalytic_tbl_Model_Analysis tma2 
                                                           WHERE tma2.imscontrol = a.controlno)
LEFT OUTER JOIN  
    Catalytic_tbl_RDR_Analysis rdr ON rdr.ImsControl = a.controlno 
                                   AND rdr.analysisid = (SELECT TOP 1 tma2.analysisid 
                                                         FROM Catalytic_tbl_RDR_Analysis tma2 
                                                         WHERE tma2.imscontrol = a.controlno)
LEFT OUTER JOIN  
    tblProducerContacts mnged ON mnged.producercontactguid = ProdC.ManagedBy
LEFT OUTER JOIN  
    lstQuoteStatusReasons r1 ON r1.id = a.QuoteStatusReasonID
WHERE      
    l.LineName = 'EARTHQUAKE'  
    AND CAST(a.EffectiveDate AS DATE) >= CAST('2017-01-01' AS DATE) 
    AND CAST(a.EffectiveDate AS DATE) <=  CAST('2017-12-31' AS DATE)
ORDER BY
    a.effectiveDate

执行计划可以在这里找到: https://www.brentozar.com/pastetheplan/?id=rJawDkTx-

我运行了 sp_help,这就是我所看到的:

这些专栏究竟出了什么问题? 我不会在 JOIN 或任何其他操作中使用它们。为什么会有这样的行为?

桌子尺寸:

表上的索引

tblQuotes

sql sql-server performance t-sql database-administration
1个回答
0
投票
WITH EarthQuakeLineList AS
    (
        SELECT
                LineGUID
        FROM    LstLines
        WHERE   LineName = 'EARTHQUAKE'  
    )
,   RiskStateList AS
    (
        SELECT 
                Risk_State1                     =   Q.stateid 
            ,   RunDateG                        =   GETDATE()
        FROM    tblQuotes           Q
        JOIN    EarthQuakeLineList  L   ON  L.LineGUID  =   Q.LineGUID
        WHERE      
                CAST(a.EffectiveDate AS DATE) BETWEEN   CAST('2017-01-01' AS DATE) 
                                                    AND CAST('2017-12-31' AS DATE)
    )


SELECT
            R.*
        ,   a.ProducerCompositeCommission
        ,   a.CompanyCompositeCommission

FROM        RiskStateList           R
INNER JOIN  LstLines                A       ON  A.LineGUID                  =   R.LineGUID
-- here the rest of the joins
-- eliminate the where clause
© www.soinside.com 2019 - 2024. All rights reserved.