CTE
(अनिवार्य रूप से) "वास्तविक" नहीं है। ऐसा नहीं है कि यह अनिवार्य रूप से सभी पंक्तियों को कहीं और कॉपी करेगा और कॉपी पर अन्य ऑपरेशन करेगा (हालांकि यह व्यवहार कर सकता है इसलिए ऑप्टिमाइज़र इसे बेहतर बनाता है)।
अगर हम यह सरल प्रश्न लें:
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (ORDER BY id) rn
FROM mytable
) q
WHERE rn BETWEEN 101 AND 110
और इसकी योजना को देखें, हम कुछ इस तरह देखेंगे:
|--Filter(WHERE:([Expr1003]>=(101) AND [Expr1003]<=(110)))
|--Top(TOP EXPRESSION:(CASE WHEN (110) IS NULL OR (110)<(0) THEN (0) ELSE (110) END))
|--Sequence Project(DEFINE:([Expr1003]=row_number))
|--Segment
|--Clustered Index Scan(OBJECT:([ee].[dbo].[mytable].[PK__mytable__3213E83F29C2D227]), ORDERED FORWARD)
यहां, रिकॉर्ड स्कैन किए जाते हैं (id
. में) तालिका id
. पर संकुलित होने के कारण क्रम ), असाइन किया गया ROW_NUMBER
(यही है Sequence Project
करता है) और TOP
. पर चला गया जो एक निश्चित सीमा तक पहुंचने पर निष्पादन को रोक देता है (110
हमारे मामले में रिकॉर्ड)।
वे 110 रिकॉर्ड Filter
. में पास किए जाते हैं जो केवल rn
. के साथ रिकॉर्ड पास करता है 100 से अधिक।
क्वेरी ही स्कैन करती है 110
रिकॉर्ड:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 1 ms.
(строк обработано: 10)
Table 'mytable'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
3 पृष्ठों में।
आइए अब अपृष्ठांकित क्वेरी देखें:
SELECT *
FROM mytable
ORDER BY
id
यह बहुत आसान है:टेबल से सब कुछ पढ़ें और इसे थूक दें।
|--Clustered Index Scan(OBJECT:([ee].[dbo].[mytable].[PK__mytable__3213E83F29C2D227]), ORDERED FORWARD)
हालांकि, आसानी से दिखने का मतलब आसानी से किया जाना नहीं है। तालिका काफी बड़ी है और हमें सभी रिकॉर्ड वापस करने के लिए कई पढ़ने की जरूरत है:
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(строк обработано: 1310720)
Table 'mytable'. Scan count 1, logical reads 2765, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 266 ms, elapsed time = 11690 ms.
तो, संक्षेप में, पेजिनेशन क्वेरी बस यह जानती है कि कब रुकना है।