ধরা যাক আমার একটি টেবিল আছে
CREATE TABLE Ticket (
TicketId int NOT NULL,
InsertDateTime datetime NOT NULL,
SiteId int NOT NULL,
StatusId tinyint NOT NULL,
AssignedId int NULL,
ReportedById int NOT NULL,
CategoryId int NULL
);
এই উদাহরণে TicketId
প্রাথমিক কী।
আমি চাই যে ব্যবহারকারীরা এই সারণির বিপরীতে "আংশিকভাবে অ্যাড-হক" অনুসন্ধান তৈরি করতে সক্ষম হন। আমি আংশিক বলেছি কারণ প্রশ্নের কিছু অংশ সর্বদা স্থির থাকবে:
- কোয়েরিটি সর্বদা একটিতে একটি ব্যাপ্তি ফিল্টার সম্পাদন
করবে
InsertDateTime
- কোয়েরিটি সর্বদা থাকবে
ORDER BY InsertDateTime DESC
- ক্যোয়ারী পৃষ্ঠা ফলাফল করবে
ব্যবহারকারী অন্য যে কোনও কলামে allyচ্ছিকভাবে ফিল্টার করতে পারবেন। তারা কোনও এক বা একাধিকতে ফিল্টার করতে পারে। এবং প্রতিটি কলামের জন্য ব্যবহারকারী মানগুলির একটি সেট থেকে নির্বাচন করতে পারে যা একটি বিযুক্তি হিসাবে প্রয়োগ করা হবে। উদাহরণ স্বরূপ:
SELECT
TicketId
FROM (
SELECT
TicketId,
ROW_NUMBER() OVER(ORDER BY InsertDateTime DESC) as RowNum
FROM Ticket
WHERE InsertDateTime >= '2013-01-01' AND InsertDateTime < '2013-02-01'
AND StatusId IN (1,2,3)
AND (CategoryId IN (10,11) OR CategoryId IS NULL)
) _
WHERE RowNum BETWEEN 1 AND 100;
এখন ধরে নিন টেবিলটিতে 100,000,000 সারি রয়েছে।
আমি যে সেরাটি সামনে আসতে পারি তা হ'ল একটি কভারিং সূচক যা প্রতিটি "optionচ্ছিক" কলামকে অন্তর্ভুক্ত করে:
CREATE NONCLUSTERED INDEX IX_Ticket_Covering ON Ticket (
InsertDateTime DESC
) INCLUDE (
SiteId, StatusId, AssignedId, ReportedById, CategoryId
);
এটি আমাকে নীচে একটি কোয়েরি পরিকল্পনা দেয়:
- নির্বাচন
- ছাঁকনি
- শীর্ষ
- সিকোয়েন্স প্রকল্প (গণনা স্কেলার)
- অংশ
- সূচি সন্ধান করুন
- অংশ
- সিকোয়েন্স প্রকল্প (গণনা স্কেলার)
- শীর্ষ
- ছাঁকনি
বেশ ভাল লাগছে। প্রায় 80% -90% ব্যয় সূচক সিক অপারেশন থেকে আসে যা আদর্শ।
এই জাতীয় অনুসন্ধান কার্যকর করার জন্য আরও ভাল কৌশল আছে কি?
অগত্যা আমি ক্লায়েন্টের কাছে alচ্ছিক ফিল্টারিং অফলোড করতে চাই না কারণ কিছু ক্ষেত্রে "স্থির" অংশ থেকে ফলাফল সেট করা 100s বা অধিকার হতে পারে। ক্লায়েন্ট তার পরে বাছাই এবং পেজিংয়ের জন্যও দায়ী, যা ক্লায়েন্টের পক্ষে খুব বেশি কাজ করতে পারে।
RowNum BETWEEN 101 AND 200
?