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

SQL प्रदर्शन:WHERE बनाम WHERE(ROW_NUMBER)

जैसा कि पहले ही बताया जा चुका है, क्वेरीज़ अलग-अलग परिणाम देती हैं और सेब की तुलना संतरे से कर रही हैं।

लेकिन अंतर्निहित प्रश्न बना रहता है:कौन सा तेज़ है:कीसेट संचालित पेजिंग या पंक्ति संख्या संचालित पेजिंग?

कीसेट पेजिंग

कीसेट संचालित पेजिंग अंतिम प्रदर्शित पृष्ठ की शीर्ष और निचली कुंजियों को याद रखने और शीर्ष/अंतिम कीसेट के आधार पर पंक्तियों के अगले या पिछले सेट का अनुरोध करने पर निर्भर करता है:

अगला पृष्ठ:

select top (<pagesize>) ...
from <table>
where key > @last_key_on_current_page
order by key;

पिछला पृष्ठ:

select top (<pagesize>)
from <table>
where key < @first_key_on_current_page
order by key desc;

ROW_NUMBER दृष्टिकोण पर या MySQL के समकक्ष LIMIT दृष्टिकोण पर इस दृष्टिकोण के दो मुख्य लाभ हैं:

  • क्या सही है :पंक्ति संख्या आधारित दृष्टिकोण के विपरीत यह नई प्रविष्टियों और हटाई गई प्रविष्टियों को सही ढंग से संभालता है। पृष्ठ 4 की अंतिम पंक्ति पृष्ठ 5 की पहली पंक्ति के रूप में केवल इसलिए दिखाई नहीं देती है क्योंकि इस बीच पृष्ठ 2 पर पंक्ति 23 हटा दी गई थी। न ही पन्ने के बीच पंक्तियाँ रहस्यमय ढंग से गायब हो जाती हैं। पंक्ति_संख्या आधारित दृष्टिकोण के साथ ये विसंगतियां आम हैं, लेकिन कुंजी सेट आधारित समाधान इनसे बचने के लिए बेहतर काम करता है।
  • तेज़ है :सभी कार्यों को तीव्र पंक्ति स्थिति के साथ हल किया जा सकता है जिसके बाद वांछित दिशा में रेंज स्कैन किया जा सकता है

हालांकि, यह दृष्टिकोण कठिन है लागू करने के लिए, औसत प्रोग्रामर द्वारा समझना मुश्किल है और टूल्स द्वारा समर्थित नहीं है।

पंक्ति संख्या संचालित

लिंक प्रश्नों के साथ पेश किया गया यह सामान्य दृष्टिकोण है:

select ...
from (
  select ..., row_number() over (...) as rn
  from table)
where rn between @firstRow and @lastRow;

(या TOP का उपयोग करते हुए एक समान क्वेरी)यह दृष्टिकोण आसान . है लागू करने के लिए और उपकरणों द्वारा समर्थित है (विशेष रूप से लिंक .लिमिट और .टेक ऑपरेटरों द्वारा)। लेकिन यह तरीका गारंटीकृत है पंक्तियों को गिनने के लिए सूचकांक को स्कैन करने के लिए। यह तरीका आमतौर पर पेज 1 के लिए बहुत तेजी से काम करता है और धीरे-धीरे धीमा हो जाता है क्योंकि एक उच्च और उच्च पेज नंबर पर जाता है।

एक बोनस के रूप में, इस समाधान के साथ सॉर्ट ऑर्डर को बदलना बहुत आसान है (बस ओवर क्लॉज बदलें)।

कुल मिलाकर, ROW_NUMBER() आधारित समाधानों की आसानी को देखते हुए, लिंक से उन्हें जो समर्थन मिला है, मॉडरेट डेटा सेट के लिए मनमाने ऑर्डर का उपयोग करने में आसानी है। ROW_NUMBER आधारित समाधान पर्याप्त हैं। बड़े और बहुत बड़े डेटा सेट के लिए, ROW_NUMBER() गंभीर प्रदर्शन समस्याएँ उत्पन्न कर सकता है।

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

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



  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. SQL सर्वर (T-SQL) में वर्तमान लॉगिन नाम लौटाएँ

  3. SQL सर्वर समर्थित संस्करण मैट्रिक्स

  4. SQL सर्वर - स्वत:वृद्धि जो अद्यतन विवरण की अनुमति देता है

  5. मैं एक SQL चयन में IF...फिर कैसे निष्पादित करूं?