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

पेजिंग को लागू करने का कारगर तरीका

यदि आप skip(n).take(m) को क्रियान्वित करते हैं, तो आपको आपके संदेह का संक्षिप्त उत्तर देने का प्रयास किया जा रहा है linq पर विधियां (डेटाबेस सर्वर के रूप में SQL 2005/2008 के साथ) आपकी क्वेरी Select ROW_NUMBER() Over ... का उपयोग करेगी स्टेटमेंट, with SQL इंजन में किसी तरह डायरेक्ट पेजिंग है।

आपको एक उदाहरण देते हुए, मेरे पास mtcity . नामक एक db तालिका है और मैंने निम्नलिखित प्रश्न लिखा (लिनक से संस्थाओं के साथ भी काम करें):

using (DataClasses1DataContext c = new DataClasses1DataContext())
{
    var query = (from MtCity2 c1 in c.MtCity2s
                select c1).Skip(3).Take(3);
    //Doing something with the query.
}

परिणामी क्वेरी होगी:

SELECT [t1].[CodCity], 
    [t1].[CodCountry], 
    [t1].[CodRegion], 
    [t1].[Name],  
    [t1].[Code]
FROM (
    SELECT ROW_NUMBER() OVER (
        ORDER BY [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]) AS [ROW_NUMBER], 
        [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
    FROM [dbo].[MtCity] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

जो एक विंडो डेटा एक्सेस है (बहुत अच्छा, btw cuz बहुत शुरुआत से ही डेटा लौटाएगा और जब तक शर्तें पूरी होंगी तब तक टेबल तक पहुंच जाएगी)। यह काफी हद तक इससे मिलता-जुलता होगा:

With CityEntities As 
(
    Select ROW_NUMBER() Over (Order By CodCity) As Row,
        CodCity //here is only accessed by the Index as CodCity is the primary
    From dbo.mtcity
)
Select [t0].[CodCity], 
        [t0].[CodCountry], 
        [t0].[CodRegion], 
        [t0].[Name],
        [t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc

अपवाद के साथ, यह दूसरी क्वेरी linq परिणाम की तुलना में तेज़ी से निष्पादित की जाएगी क्योंकि यह डेटा एक्सेस विंडो बनाने के लिए विशेष रूप से अनुक्रमणिका का उपयोग करेगी; इसका मतलब है, यदि आपको कुछ फ़िल्टरिंग की आवश्यकता है, तो फ़िल्टरिंग इकाई सूची (जहां पंक्ति बनाई गई है) में होनी चाहिए (या होनी चाहिए) और अच्छे प्रदर्शन को बनाए रखने के लिए कुछ इंडेक्स भी बनाए जाने चाहिए।

अब, क्या बेहतर है?

यदि आपके तर्क में बहुत अधिक ठोस कार्यप्रवाह है, तो उचित SQL तरीके को लागू करना जटिल होगा। उस स्थिति में LINQ समाधान होगा।

यदि आप तर्क के उस हिस्से को सीधे SQL (एक संग्रहीत प्रक्रिया में) में कम कर सकते हैं, तो यह और भी बेहतर होगा क्योंकि आप दूसरी क्वेरी को लागू कर सकते हैं जो मैंने आपको दिखाया था (इंडेक्स का उपयोग करके) और SQL को निष्पादन योजना बनाने और संग्रहीत करने की अनुमति देता है। क्वेरी (प्रदर्शन में सुधार)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मान को अल्पविराम से अलग करने के लिए COALESCE फ़ंक्शन का उपयोग करना

  2. JDBC के माध्यम से एक Linux मशीन से Windows प्रमाणीकरण के साथ SQL सर्वर से कनेक्ट करें

  3. SQL सर्वर स्लीप के समतुल्य ():WAITFOR स्टेटमेंट

  4. यादृच्छिक तिथि के साथ पंक्तियों को कैसे अपडेट करें

  5. आप एक बड़ी MS SQL .sql फ़ाइल कैसे आयात करते हैं?