SQL सर्वर में ROW_NUMBER के साथ पेजिंग कैसे काम करता है?


13

मेरे पास एक Employeeतालिका है जिसमें एक मिलियन रिकॉर्ड हैं। मैं एक वेब अनुप्रयोग में डेटा पेजिंग के लिए एसक्यूएल का पालन कर रहा हूं। यह ठीक काम कर रहा है। हालाँकि मैं एक मुद्दे के रूप में जो देख रहा हूं वह है - व्युत्पन्न तालिका तालिका में tblEmployeeसभी रिकॉर्ड Employee( MyRowNumberमान बनाने के लिए ) का चयन करती है।

मुझे लगता है, यह Employeeतालिका में सभी रिकॉर्डों के चयन का कारण बनता है ।

क्या यह वास्तव में ऐसा काम करता है? या SQL सर्वर मूल Employeeतालिका से केवल 5 रिकॉर्ड का चयन करने के लिए अनुकूलित है?

DECLARE @Index INT;
DECLARE @PageSize INT;

SET @Index = 3;
SET @PageSize = 5;

SELECT *  FROM
  (SELECT  ROW_NUMBER() OVER (ORDER BY EmpID asc) as MyRowNumber,*
  FROM Employee) tblEmployee
WHERE MyRowNumber BETWEEN ( ((@Index - 1) * @PageSize )+ 1) AND @Index*@PageSize 

3
देखें sqlservercentral.com/articles/T-SQL/66030 और अधिक महत्वपूर्ण आगामी चर्चा
हारून बर्ट्रेंड

जवाबों:


17

परीक्षण का एक विकल्प हो सकता है:

;WITH x AS (SELECT EmpID, k = ROW_NUMBER() OVER (ORDER BY EmpID) FROM dbo.Emp)
SELECT e.columns
FROM x INNER JOIN dbo.Emp AS e
ON x.EmpID = e.EmpID
WHERE x.k BETWEEN (((@Index - 1) * @PageSize) + 1) AND @Index * @PageSize
ORDER BY ...;

हां, आपने तालिका को दो बार हिट किया, लेकिन सीटीई में जहां आप पूरी तालिका को स्कैन करते हैं, आप केवल कुंजी को पकड़ रहे हैं, सभी डेटा को नहीं। लेकिन आपको वास्तव में इस लेख को देखना चाहिए:

http://www.sqlservercentral.com/articles/T-SQL/66030/

और अनुवर्ती चर्चा:

http://www.sqlservercentral.com/Forums/Topic672980-329-1.aspx

SQL सर्वर 2012 में निश्चित रूप से आप नए OFFSET/ FETCH NEXTवाक्यविन्यास का उपयोग कर सकते हैं :

;WITH x AS 
(
  SELECT EmpID FROM dbo.Emp
    ORDER BY EmpID
    OFFSET  @PageSize * (@Index - 1) ROWS
    FETCH NEXT @PageSize ROWS ONLY
)
SELECT e.columns
FROM x INNER JOIN dbo.Emp AS e
ON x.EmpID = e.EmpID
ORDER BY ...; 

हालांकि यह नोट किया जाना चाहिए कि OFFSET / FETCH NTE CTE पद्धति से अधिक कोई प्रदर्शन लाभ प्रदान नहीं करता है
आकाश

2
@ आकाश ने क्या आपने इसका पूरी तरह से परीक्षण किया है? मैंने कुछ योजनागत मतभेदों को देखा है, लेकिन प्रदर्शन के बारे में कुछ भी विशेष रूप से उल्लेख नहीं किया है क्योंकि मैंने कोई व्यापक परीक्षण नहीं किया है। भले ही प्रदर्शन समान हो, वाक्य-विन्यास थोड़ा कम बोझिल हो। : मैं इसके बारे में यहाँ ब्लॉग था sqlblog.com/blogs/aaron_bertrand/archive/2010/11/10/...
हारून बर्ट्रेंड

1
आह, तुम सही हो, एक प्रदर्शन अंतर है। मैंने इसे पढ़ा था: blogs.technet.com/b/dataplatforminsider/archive/2011/11/01/… जहां उसने कोई अंतर नहीं होने का उल्लेख किया है, लेकिन अभी देखा चैनल 9.msdn.com/posts/SQL11UPD03-REC-02 जहां वह उपचार दिखाता है बहुत अंतर है .. (हालांकि ऑडियो अंडरपहासिस में प्रदर्शन अंतर)
आकाश

2

हालाँकि आप इसके पीछे के तंत्र को नहीं जान सकते हैं, आप अपनी क्वेरी के प्रदर्शन की तुलना करके स्वयं इसका परीक्षण कर सकते हैं: कर्मचारी से * का चयन करें।

SQL सर्वर के हाल के संस्करण अनुकूलन का एक बहुत अच्छा काम करते हैं, लेकिन यह कई कारकों पर निर्भर कर सकता है।

आपका ROW_NUMBER फ़ंक्शन कैसे कार्य करता है यह ऑर्डर बाय क्लॉज द्वारा संचालित होने वाला है। आपके उदाहरण में, सबसे अनुमान होगा कि प्राथमिक प्राथमिक कुंजी है।

कुछ कर रहे हैं , जहां खंड है कि इतनी जटिल और / या खराब कोडित या अनुक्रमित हैं, तो आप से बेहतर बस पूरे डाटासेट (यह दुर्लभ है और तय किया जा सकता है) वापस आया हो। BETWEEN का उपयोग मुद्दों है।

इससे पहले कि आप यह मान लें कि आपके आवेदन में सभी पंक्तियों को वापस करना बेहतर होगा और इसे पता लगाने दें, आपको अपनी क्वेरी को अनुकूलित करने पर काम करना चाहिए। अनुमानों की जाँच करें। क्वेरी विश्लेषक से पूछें। कुछ विकल्पों का परीक्षण करें।


2

मुझे पता है कि सवाल row_number () के बारे में है, लेकिन मैं sql सर्वर 2012 की एक नई सुविधा जोड़ना चाहता हूं। sql सर्वर 2012 में अगली बार OFFSET Fetch को पेश किया गया है और यह row_number () से बहुत तेज है। मैंने इसका उपयोग किया है और यह मुझे अच्छा परिणाम देता है उम्मीद है कि आप लोग भी ऐसा ही अनुभव भरेंगे।

मुझे http://blogfornet.com/2013/06/sql-server-2012-offset-use/ पर एक उदाहरण मिला

जो उपयोगी है। आशा है कि यह आपको नई सुविधाओं को लागू करने में भी मदद करेगा…।


-2

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


-2
DECLARE @PageIndex int;
DECLARE @PageSize int;
SET @PageIndex = 4;
SET @PageSize = 5;
;With ranked AS   --- Or you can make it a view
(
   SELECT ROW_NUMBER() OVER(ORDER BY IdentityId) AS RowNum,  *
   FROM logeventnew
)
SELECT *   --Your fields here
FROM Ranked
WHERE RowNum BETWEEN ((@PageIndex - 1) * @PageSize + 1)
    AND (@PageIndex * @PageSize)
ORDER BY IdentityId

4
क्या आप अपने जवाब पर विस्तार कर सकते हैं? प्रश्न यह था कि पेजिंग SQL सर्वर पर आंतरिक रूप से कैसे काम करता है - अर्थात अनुरोध को पूरा करने के लिए डेटाबेस इंजन क्या करता है। दुर्भाग्य से, अब तक, आपका जवाब वास्तविक चिंता का समाधान नहीं करता है।
Mr.Brownstone
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.