आपके द्वारा पोस्ट की गई क्वेरी में:
select * from <table_name>;
100 वीं -200 वीं पंक्तियों में ऐसी कोई बात नहीं है, क्योंकि आप ORDER BY को निर्दिष्ट नहीं करते हैं। आदेश की गारंटी नहीं है जब तक कि आप पूरे दिलचस्प कारणों से ORDER BY को शामिल न करें, लेकिन यह वास्तव में यहाँ बात नहीं है।
तो अपनी बात को स्पष्ट करने के लिए, आइए एक तालिका का उपयोग करें - मैं स्टैक ओवरफ्लो डेटा डंप और इस क्वेरी से उपयोगकर्ता तालिका का उपयोग करने जा रहा हूं :
SELECT * FROM dbo.Users ORDER BY DisplayName;
डिफ़ॉल्ट रूप से, DisplayName फ़ील्ड पर कोई इंडेक्स नहीं है, इसलिए SQL सर्वर को संपूर्ण तालिका को स्कैन करना है, फिर इसे DisplayName द्वारा सॉर्ट करें। यहाँ निष्पादन योजना है :
यह सुंदर नहीं है - यह बहुत काम है, लगभग 30k की अनुमानित सबट्री लागत के साथ। (आप इसे PasteThePlan पर चुनिंदा ऑपरेटर पर अपने माउस को मँडरा कर देख सकते हैं।) तो क्या होगा यदि हम केवल 100-200 पंक्तियों को चाहते हैं? हम SQL Server 2012 में इस सिंटैक्स का उपयोग कर सकते हैं:
SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
उस पर निष्पादन योजना बहुत बदसूरत है:
SQL सर्वर अभी भी आपकी तालिका को 100-200 देने के लिए पूरी सूची को बनाने के लिए पूरी तालिका को स्कैन कर रहा है, और लागत अभी भी 30k के आसपास है। इससे भी बदतर, यह पूरी सूची आपकी क्वेरी चलने पर हर बार फिर से बनाई जाएगी (क्योंकि आखिरकार, किसी ने अपना DisplayName बदल दिया होगा।)
इसे तेज़ी से आगे बढ़ाने के लिए, हम DisplayName पर एक गैर-अनुक्रमित सूचकांक बना सकते हैं, जो कि हमारी तालिका की एक प्रति है, जो उस विशिष्ट क्षेत्र द्वारा क्रमबद्ध है:
CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);
उस सूचकांक के साथ, हमारी क्वेरी के निष्पादन की योजना अब एक सूचकांक की तलाश करती है:
क्वेरी तुरंत समाप्त हो जाती है और इसकी अनुमानित सबट्री लागत केवल 0.66 होती है (30k के विपरीत)।
सारांश में, यदि आप डेटा को उस तरीके से व्यवस्थित करते हैं जो आपके द्वारा चलाए जा रहे प्रश्नों का समर्थन करता है, तो हाँ, SQL सर्वर आपके प्रश्नों को तेज़ी से आगे बढ़ाने के लिए शॉर्टकट ले सकता है। यदि, दूसरी ओर, आपके पास सभी ढेर या क्लस्टर इंडेक्स हैं, तो आप खराब हैं।