প্রশ্নের উদাহরণগুলিতে একই ফলাফলগুলি বেশিরভাগই উত্পন্ন হয় না ( 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
মূল উদাহরণে) অপ্টিমাইজার শীর্ষের পরে একটি সম্পূর্ণ সাজানোর পরিবর্তে একটি শীর্ষN বাছাই করতে পারে। টপএন বাছাইয়ের জন্য সারিগুলি যখন একটি ধ্রুবক আক্ষরিক হয় এবং <= 100 (যোগফল OFFSET
এবং যোগফল FETCH
) হয় তখন এক্সিকিউশন ইঞ্জিন একটি আলাদা ধরণের অ্যালগরিদম ব্যবহার করতে পারে যা সাধারণ টপএন সাজানোর চেয়ে দ্রুত সম্পাদন করতে পারে। তিনটি ক্ষেত্রেই সামগ্রিকভাবে পারফরম্যান্সের বৈশিষ্ট্য রয়েছে।
কেন অপ্টিমাইজারটি ROW_NUMBER
সিনট্যাক্স প্যাটার্নটি ব্যবহারের জন্য স্বয়ংক্রিয়ভাবে রূপান্তর করে না OFFSET
, এর বিভিন্ন কারণ রয়েছে:
- এমন একটি রূপান্তর লিখতে প্রায় অসম্ভব যা সমস্ত বিদ্যমান ব্যবহারের সাথে মেলে
- কিছু পেজিংয়ের প্রশ্নগুলি স্বয়ংক্রিয়ভাবে পরিবর্তিত হয়েছে এবং অন্যেরা বিভ্রান্ত হতে পারে না
OFFSET
পরিকল্পনা সব ক্ষেত্রেই ভালো হতে নিশ্চিত করা হয় না
উপরের তৃতীয় পয়েন্টের একটি উদাহরণ দেখা যায় যেখানে পেজিং সেটটি বেশ প্রশস্ত থাকে। এটা তোলে আরো অনেক কিছু দক্ষ হতে পারে কি প্রয়োজন চাইতে একটি nonclustered সূচক এবং ম্যানুয়ালি ক্লাস্টার সূচক বিরুদ্ধে লুকআপ সঙ্গে সূচক স্ক্যান সঙ্গে তুলনা ব্যবহার OFFSET
বা ROW_NUMBER
। পেজিং অ্যাপ্লিকেশনটিতে মোট কতগুলি সারি বা পৃষ্ঠাগুলি রয়েছে তা জানতে হবে কিনা তা বিবেচনা করার জন্য অতিরিক্ত সমস্যা রয়েছে। সেখানে আপেক্ষিক যথার্থতা আরেকটি ভাল আলোচনা 'কী চাইতে' এবং 'অফসেট' পদ্ধতি এখানে ।
সামগ্রিকভাবে, ভালতর OFFSET
পরীক্ষা-নিরীক্ষার পরে লোকেরা তাদের পেজিং কোয়েরিগুলি যথাযথভাবে পরীক্ষা করার পরে ব্যবহার করার জন্য পরিবর্তন করার জন্য একটি অবগত সিদ্ধান্ত গ্রহণ করবে better