আমার এই মত একটি টেবিল আছে:
CREATE TABLE Updates
(
UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
ObjectId INT NOT NULL
)
মূলত বর্ধমান আইডি সহ অবজেক্টগুলিতে আপডেটগুলি ট্র্যাক করা।
এই টেবিলের গ্রাহক ১০০ স্বতন্ত্র অবজেক্ট আইডির একটি অংশ বেছে নেবেন, অর্ডার দিয়ে UpdateId
এবং নির্দিষ্ট থেকে শুরু করে UpdateId
। মূলত, এটি কোথায় ছেড়ে গেছে তা ট্র্যাক করে রাখা এবং তারপরে কোনও আপডেটের জন্য অনুসন্ধান করা।
আমি এটি একটি আকর্ষণীয় অপ্টিমাইজেশান সমস্যা হিসাবে পেয়েছি কারণ আমি কেবলমাত্র সন্ধানের সূত্রগুলির কারণে যা করতে চাই তা ঘটায় এমন প্রশ্নগুলি লিখে সর্বাধিক অনুকূল কোয়েরি পরিকল্পনা তৈরি করতে সক্ষম হয়েছি তবে আমি কী চাই তা গ্যারান্টি দিচ্ছি না:
SELECT DISTINCT TOP 100 ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
যেখানে @fromUpdateId
একটি সঞ্চিত প্রক্রিয়া পরামিতি।
এর একটি পরিকল্পনা সহ:
SELECT <- TOP <- Hash match (flow distinct, 100 rows touched) <- Index seek
UpdateId
সূচকটি ব্যবহারের জন্য সন্ধানের কারণে , ফলাফলগুলি ইতিমধ্যে দুর্দান্ত এবং আমার পছন্দ মতো সর্বনিম্ন থেকে সর্বোচ্চ আপডেট আইডি পর্যন্ত অর্ডার করা হয়েছে। এবং এটি একটি প্রবাহ স্বতন্ত্র পরিকল্পনা উত্পন্ন করে , যা আমি চাই। তবে আদেশ অবশ্যই স্পষ্টভাবে গ্যারান্টিযুক্ত আচরণ নয়, তাই আমি এটি ব্যবহার করতে চাই না।
এই কৌশলটি একই ক্যোয়ারী পরিকল্পনার ফলাফলও দেয় (যদিও অপ্রয়োজনীয় শীর্ষের সাথে):
WITH ids AS
(
SELECT ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
ORDER BY UpdateId OFFSET 0 ROWS
)
SELECT DISTINCT TOP 100 ObjectId FROM ids
যদিও, আমি নিশ্চিত নই (এবং সন্দেহ নেই) যদি এটি সত্যই অর্ডার দেওয়ার নিশ্চয়তা দেয়।
আমি আশা করি যে এসকিউএল সার্ভারটি সহজ করার জন্য যথেষ্ট স্মার্ট হবে এটি একটি কোয়েরি, তবে এটি একটি খুব খারাপ ক্যোয়ারী পরিকল্পনা উত্পন্ন করে:
SELECT TOP 100 ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
GROUP BY ObjectId
ORDER BY MIN(UpdateId)
এর একটি পরিকল্পনা সহ:
SELECT <- Top N Sort <- Hash Match aggregate (50,000+ rows touched) <- Index Seek
আমি একটি সূচী অনুসারে একটি অনুকূল পরিকল্পনা উত্পন্ন করার একটি উপায় UpdateId
এবং সদৃশগুলি অপসারণের জন্য পৃথক একটি প্রবাহের সন্ধান করার চেষ্টা করছি ObjectId
। কোন ধারনা?
আপনি যদি চান ডেটা নমুনা । অবজেক্টগুলিতে খুব কমই একাধিক আপডেট হবে এবং 100 টি সারির একটি সেটের মধ্যে প্রায় একের বেশি হওয়া উচিত নয়, যার কারণেই আমি আরও ভাল কিছু না জানি যদি না আমি প্রবাহের স্বতন্ত্র হয়ে থাকি? যাইহোক, কোনও গ্যারান্টি নেই যে কোনও একক ObjectId
টেবিলে 100 টিরও বেশি সারি থাকবে না। সারণীতে এক হাজারেরও বেশি সারি রয়েছে এবং এটি দ্রুত বাড়তে পারে বলে আশা করা হচ্ছে।
ব্যবহারকারী ধরে এই পরবর্তী উপযুক্ত এটি অন্য উপায় আছে @fromUpdateId
। এই কোয়েরিতে এটি ফেরত দেওয়ার দরকার নেই।