我有
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
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