Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में सर्वर साइड पेजिंग

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.

तो, संक्षेप में, पेजिनेशन क्वेरी बस यह जानती है कि कब रुकना है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लिंक किए गए sql सर्वर को क्वेरी करना

  2. अद्वितीय माता-पिता को बच्चे से जोड़ने के लिए क्वेरी की आवश्यकता है जो अद्वितीय नहीं है लेकिन MAX . के साथ अद्वितीय बनाया जा सकता है

  3. विशिष्ट प्रकाशन संदर्भ में टी-एसक्यूएल मर्ज प्रदर्शन

  4. डेटाबेस नाम के लिए Sql समानार्थी या उपनाम कैसे बनाएं?

  5. SQL सर्वर 2008 में शामिल होना