मैं जानना चाहता था कि निम्नलिखित दो दृष्टिकोणों में से कौन सा तेज़ है:
1) तीन COUNT
:
SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d
WHERE d.Status = 'Approved'),
Valid = (SELECT COUNT(*) FROM dbo.Claims d
WHERE d.Status = 'Valid'),
Reject = (SELECT COUNT(*) FROM dbo.Claims d
WHERE d.Status = 'Reject')
2) SUM
के साथ FROM
-clause:
SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END),
Valid = SUM(CASE WHEN Status = 'Valid' THEN 1 ELSE 0 END),
Reject = SUM(CASE WHEN Status = 'Reject' THEN 1 ELSE 0 END)
FROM dbo.Claims c;
मुझे आश्चर्य हुआ कि अंतर इतना बड़ा है। तीन उपश्रेणियों वाली पहली क्वेरी तुरंत परिणाम देती है जबकि दूसरे SUM
दृष्टिकोण को 18 सेकंड की आवश्यकता होती है।
Claims
एक दृश्य है जो ~ 18 मिलियन पंक्तियों वाली तालिका से चयन करता है। FK-Column में ClaimStatus
टेबल पर एक इंडेक्स होता है जिसमें स्टेटस-नाम होता है।
यह इतना बड़ा अंतर क्यों करता है कि मैं उपयोग करता हूं COUNT
या SUM
?
निष्पादन-योजनाओं:
कुल 12 स्थितियां हैं। उन तीन स्थितियों में सभी पंक्तियों का 7% हिस्सा है।
यह वास्तविक दृश्य है, मुझे यकीन नहीं है कि यह प्रासंगिक है:
CREATE VIEW [dbo].[Claims]
AS
SELECT
mu.Marketunitname AS MarketUnit,
c.Countryname AS Country,
gsp.Gspname AS GSP,
gsp.Wcmskeynumber AS GspNumber,
sl.Slname AS SL,
sl.Wcmskeynumber AS SlNumber,
m.Modelname AS Model,
m.Salesname AS [Model-Salesname],
s.Claimstatusname AS [Status],
d.Work_order AS [Work Order],
d.Ssn_number AS IMEI,
d.Ssn_out,
Remarks,
d.Claimnumber AS [Claim-Number],
d.Rma_number AS [RMA-Number],
dbo.ToShortDateString(d.Received_Date, 1) AS [Received Date],
Iddata,
Fisl,
Fimodel,
Ficlaimstatus
FROM Tabdata AS d
INNER JOIN Locsl AS sl
ON d.Fisl = sl.Idsl
INNER JOIN Locgsp AS gsp
ON sl.Figsp = gsp.Idgsp
INNER JOIN Loccountry AS c
ON gsp.Ficountry = c.Idcountry
INNER JOIN Locmarketunit AS mu
ON c.Fimarketunit = mu.Idmarketunit
INNER JOIN Modmodel AS m
ON d.Fimodel = m.Idmodel
INNER JOIN Dimclaimstatus AS s
ON d.Ficlaimstatus = s.Idclaimstatus
INNER JOIN Tdefproducttype
ON d.Fiproducttype = Tdefproducttype.Idproducttype
LEFT OUTER JOIN Tdefservicelevel
ON d.Fimaxservicelevel = Tdefservicelevel.Idservicelevel
LEFT OUTER JOIN Tdefactioncode AS ac
ON d.Fimaxactioncode = ac.Idactioncode
Authorized
।
WHERE c.Status = 'Approved' or c.Status = 'Valid' or c.status = 'Reject'
करने के लिए SUM
संस्करण।
COUNT
योजना के संस्करण की ओर इशारा करता है । क्या आपSUM
सही योजना को इंगित करने के लिए संस्करण की तरह संपादित कर सकते हैं ?