उदाहरण:
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS ON;
CREATE TABLE MyTable (MyID INT PRIMARY KEY);
GO
INSERT MyTable (MyID)
VALUES (11), (22), (33), (44), (55);
PRINT 'Test MyCTE:';
WITH MyCTE
AS (
SELECT *, ROW_NUMBER()OVER(ORDER BY MyID) AS RowNum
FROM MyTable
)
SELECT *
FROM MyCTE crt
LEFT JOIN MyCTE prev ON crt.RowNum=prev.RowNum+1;
ROLLBACK;
यदि आप SSMS में पिछली स्क्रिप्ट चलाते हैं (Ctrl+M
दबाएं) -> वास्तविक निष्पादन योजना) तो आपको अंतिम क्वेरी के लिए यह निष्पादन योजना मिल जाएगी:
इस मामले में, सीटीई को crt
. के लिए एक बार निष्पादित किया जाता है उपनाम और prev
. के लिए पांच (!) बार उपनाम, crt
. से प्रत्येक पंक्ति के लिए एक बार ।
तो, इस सवाल का जवाब
both
है :एक बार प्रति क्वेरी (crt
) और प्रति पंक्ति एक बार (prev
:crt
. से प्रत्येक के लिए एक बार )।
इस क्वेरी को अनुकूलित करने के लिए, शुरुआत के लिए, 1) आप सीटीई (MyCTE
) से परिणामों को संग्रहीत करने का प्रयास कर सकते हैं। या Query
) तालिका चर या अस्थायी तालिका में
2) इस तालिका की प्राथमिक कुंजी को जॉइन कॉलम के रूप में परिभाषित करें,
3) इस तालिका चर या अस्थायी तालिका का उपयोग करने के लिए अंतिम क्वेरी को फिर से लिखें।
बेशक, आप सीटीई के बीच स्वयं शामिल हुए बिना अंतिम क्वेरी को फिर से लिखने का प्रयास कर सकते हैं।