[Sql] पेजिंग को लागू करने के लिए कुशल तरीका


Answers

उपयोग करने का प्रयास करें

FROM [TableX]
ORDER BY [FieldX]
OFFSET 500 ROWS
FETCH NEXT 100 ROWS ONLY

SQL सर्वर में पंक्तियों को 501 से 600 तक प्राप्त करने के लिए, उन्हें स्मृति में लोड किए बिना। ध्यान दें कि यह वाक्यविन्यास केवल SQL Server 2012 के साथ उपलब्ध हो गया है

Question

क्या मुझे पेजिंग के लिए LINQ की Skip() और Take() विधि का उपयोग करना चाहिए, या SQL क्वेरी के साथ अपने स्वयं के पेजिंग को कार्यान्वित करना चाहिए?

कौन सा सबसे कुशल है? मैं एक दूसरे पर क्यों चुनूँगा?

मैं एसक्यूएल सर्वर 2008, एएसपी.नेट एमवीसी और LINQ का उपयोग कर रहा हूँ।




एसक्यूएल सर्वर 2008 में:

DECLARE @PAGE INTEGER = 2
DECLARE @TAKE INTEGER = 50

SELECT [t1].*
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[COLUMNORDER] DESC) AS [ROW_NUMBER], [t0].*
    FROM [dbo].[TABLA] AS [t0]
    WHERE ([t0].[COLUMNS_CONDITIONS] = 1)
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN ((@PAGE*@TAKE) - (@TAKE-1)) AND (@PAGE*@TAKE)
ORDER BY [t1].[ROW_NUMBER]

टी 0 में सभी रिकॉर्ड हैं टी 1 में केवल उस पृष्ठ के अनुरूप हैं




LinqToSql स्वचालित रूप से एक .kip (N1) को परिवर्तित कर देगा। टेक (एन 2) आपके लिए टीएसक्यूएल सिंटैक्स में। वास्तव में, लिंकक में आप जो भी "क्वेरी" करते हैं, वास्तव में पृष्ठभूमि में आपके लिए एक SQL क्वेरी बना रहा है। इसका परीक्षण करने के लिए, बस अपना एप्लिकेशन चल रहा है, तो बस SQL ​​प्रोफाइलर चलाएं।

स्किप / टेक पद्धति ने मेरे लिए बहुत अच्छा काम किया है, और जो कुछ मैंने पढ़ा है उससे।

जिज्ञासा से, आपके पास किस प्रकार की स्वयं-पेजिंग क्वेरी है, जो आपको लगता है कि लिंकक की छोड़ने / ले जाने से अधिक कुशल है?




पेजिंडेक्स पास करके आप इस सरल तरीके से पेजिंग को कार्यान्वित कर सकते हैं

Declare @PageIndex INT = 1
Declare  @PageSize INT = 20

Select ROW_NUMBER() OVER ( ORDER BY Products.Name ASC )  AS RowNumber,
    Products.ID,
    Products.Name
into #Result 
From Products

SELECT @RecordCount = COUNT(*) FROM #Results 

SELECT * 
FROM #Results
WHERE RowNumber
BETWEEN
    (@PageIndex -1) * @PageSize + 1 
    AND
    (((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1



Links