कृपया Sql सर्वर में निम्नलिखित 2 बयान पर विचार करें:Sql सर्वर - बाहरी बनाम उप प्रश्नों लागू
यह एक नेस्टेड उप प्रश्नों उपयोग कर रहा है:
WITH cte AS
(
SELECT TOP 100 PERCENT *
FROM Segments
ORDER BY InvoiceDetailID, SegmentID
)
SELECT *, ReturnDate =
(SELECT TOP 1 cte.DepartureInfo
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID),
DepartureCityCode =
(SELECT TOP 1 cte.DepartureCityCode
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID)
FROM Segments seg
और यह एक बाहरी उपयोग करता लागू ऑपरेटर:
WITH cte AS
(
SELECT TOP 100 PERCENT *
FROM Segments
ORDER BY InvoiceDetailID, SegmentID
)
SELECT seg.*, t.DepartureInfo AS ReturnDate, t.DepartureCityCode
FROM Segments seg OUTER APPLY (
SELECT TOP 1 cte.DepartureInfo, cte.DepartureCityCode
FROM cte
WHERE seg.InvoiceDetailID = cte.InvoiceDetailID
AND cte.SegmentID > seg.SegmentID
) t
इनमें से कौन सा 2 संभावित रूप से बेहतर प्रदर्शन करेगा क्योंकि दोनों सेगमेंट टेबल में संभावित रूप से लाखों पंक्तियां हो सकती हैं?
मेरा अंतर्ज्ञान बाहरी आवेदन बेहतर प्रदर्शन करेगा।
अधिक सवालों की एक जोड़ी:
- लगभग मैं इस बारे में काफी यकीन है, लेकिन अभी भी पुष्टि करते हैं कि पहले समाधान में चाहते थे, CTE प्रभावी रूप से दो बार क्रियान्वित किया जा सकता है (क्योंकि इसके दो बार जिक्र किया गया और CTE है एक मैक्रो की तरह विस्तारित इनलाइन)।
- आउटपुट ऑपरेटर ऑपरेटर में उपयोग किए जाने पर प्रत्येक पंक्ति के लिए एक बार सीटीई निष्पादित किया जाएगा? पहले कथन में नेस्टेड क्वेरी में इस्तेमाल होने पर भी प्रत्येक पंक्ति के लिए इसे निष्पादित किया जाएगा ??
रन का निरीक्षण क्वेरी योजना बना रही है –
'टॉप 100 प्रतिशत ... ऑर्डर बाय 'को रास्ते से अनुकूलित किया गया है और इसका कोई प्रभाव नहीं है। मैं सहमत हूं कि दूसरे को बेहतर प्रदर्शन करना चाहिए। प्रति समूह 'TOP 1' प्राप्त करने के लिए आप 'ROW_NUMBER' और' PARTITION BY' 'भी देख सकते हैं। –