प्रश्न में उदाहरण समान परिणाम नहीं देते हैं ( OFFSET
उदाहरण में एक-एक त्रुटि है)। नीचे दिए गए अपडेट किए गए फॉर्म उस समस्या को ठीक करते हैं, ROW_NUMBER
मामले के लिए अतिरिक्त प्रकार को हटाते हैं , और समाधान को अधिक सामान्य बनाने के लिए चर का उपयोग करते हैं:
DECLARE
@PageSize bigint = 10,
@PageNumber integer = 3;
WITH Numbered AS
(
SELECT TOP ((@PageNumber + 1) * @PageSize)
o.*,
rn = ROW_NUMBER() OVER (
ORDER BY o.[object_id])
FROM #objects AS o
ORDER BY
o.[object_id]
)
SELECT
x.name,
x.[object_id],
x.principal_id,
x.[schema_id],
x.parent_object_id,
x.[type],
x.type_desc,
x.create_date,
x.modify_date,
x.is_ms_shipped,
x.is_published,
x.is_schema_published
FROM Numbered AS x
WHERE
x.rn >= @PageNumber * @PageSize
AND x.rn < ((@PageNumber + 1) * @PageSize)
ORDER BY
x.[object_id];
SELECT
o.name,
o.[object_id],
o.principal_id,
o.[schema_id],
o.parent_object_id,
o.[type],
o.type_desc,
o.create_date,
o.modify_date,
o.is_ms_shipped,
o.is_published,
o.is_schema_published
FROM #objects AS o
ORDER BY
o.[object_id]
OFFSET @PageNumber * @PageSize - 1 ROWS
FETCH NEXT @PageSize ROWS ONLY;
ROW_NUMBER
योजना की अनुमानित लागत है 0.0197935 :
OFFSET
योजना की अनुमानित लागत है 0.0196955 :
यह 0.000098 अनुमानित लागत इकाइयों की बचत है (हालांकि OFFSET
यदि आपको प्रत्येक पंक्ति के लिए एक पंक्ति संख्या वापस करना है तो योजना को अतिरिक्त ऑपरेटरों की आवश्यकता होगी)। OFFSET
योजना अभी भी थोड़ा सस्ता होगा, आम तौर पर बोल रहा है, लेकिन याद है कि अनुमानित लागत वास्तव में कर रहे हैं - वास्तविक परीक्षण अभी भी आवश्यक है। दोनों योजनाओं में लागत का बड़ा हिस्सा इनपुट सेट के पूर्ण प्रकार की लागत है, इसलिए सहायक सूचकांक दोनों समाधानों को लाभान्वित करेंगे।
जहाँ निरंतर शाब्दिक मानों का उपयोग किया जाता है (उदाहरण OFFSET 30
में मूल उदाहरण में) ऑप्टिमाइज़र एक पूर्ण प्रकार के बजाय एक शीर्ष के बाद एक टॉपएन सॉर्ट का उपयोग कर सकता है। जब टॉपएन सॉर्ट से आवश्यक पंक्तियाँ एक निरंतर शाब्दिक और <= 100 (का योग OFFSET
और FETCH
) निष्पादन इंजन एक अलग प्रकार के एल्गोरिथ्म का उपयोग कर सकता है जो सामान्यीकृत टॉपएन सॉर्ट की तुलना में तेजी से प्रदर्शन कर सकता है। तीनों मामलों में कुल मिलाकर अलग-अलग प्रदर्शन विशेषताएं हैं।
इस कारण से कि ऑप्टिमाइज़र स्वचालित रूप ROW_NUMBER
से उपयोग करने के लिए सिंटैक्स पैटर्न को रूपांतरित नहीं करता है OFFSET
, इसके कई कारण हैं:
- एक परिवर्तन लिखना लगभग असंभव है जो सभी मौजूदा उपयोगों से मेल खाएगा
- पेजिंग के कुछ सवाल अपने आप बदल गए और दूसरों को भ्रमित नहीं किया जा सका
OFFSET
योजना सभी मामलों में बेहतर होने की गारंटी नहीं है
ऊपर तीसरे बिंदु के लिए एक उदाहरण होता है जहां पेजिंग सेट काफी विस्तृत है। यह एक गैर-अनुक्रमित सूचकांक का उपयोग करके आवश्यक कुंजियों की तलाश करने के लिए बहुत अधिक कुशल हो सकता है और मैन्युअल रूप से सूचकांक को स्कैन करने की तुलना में क्लस्टर इंडेक्स के खिलाफ खोज OFFSET
कर सकता है ROW_NUMBER
। विचार करने के लिए अतिरिक्त मुद्दे हैं कि पेजिंग एप्लिकेशन को यह जानने की जरूरत है कि कुल कितनी पंक्तियां या पेज हैं। यहाँ 'प्रमुख तलाश' और 'ऑफसेट' विधियों के सापेक्ष गुणों की एक और अच्छी चर्चा है ।
कुल मिलाकर, यह शायद बेहतर है कि लोग OFFSET
पूरी तरह से परीक्षण के बाद, यदि उचित हो, उपयोग करने के लिए अपने पेजिंग प्रश्नों को बदलने के लिए एक सूचित निर्णय लेते हैं ।