สมมติว่าฉันมีตารางเดียว
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
- แบบสอบถามจะหน้าผลลัพธ์
ผู้ใช้สามารถเลือกที่จะกรองคอลัมน์อื่นใดก็ได้ พวกเขาสามารถกรองไม่มีใครคนหนึ่งหรือหลายคน และสำหรับแต่ละคอลัมน์ผู้ใช้อาจเลือกจากชุดของค่าที่จะนำไปใช้เป็นความแตกแยก ตัวอย่างเช่น:
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 แถว
สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือดัชนีครอบคลุมที่มีคอลัมน์ "ทางเลือก" แต่ละคอลัมน์:
CREATE NONCLUSTERED INDEX IX_Ticket_Covering ON Ticket (
InsertDateTime DESC
) INCLUDE (
SiteId, StatusId, AssignedId, ReportedById, CategoryId
);
สิ่งนี้ทำให้ฉันมีแผนแบบสอบถามดังนี้
- เลือก
- กรอง
- ด้านบน
- โครงการลำดับ (คำนวณสเกลาร์)
- ส่วน
- ดัชนีค้นหา
- ส่วน
- โครงการลำดับ (คำนวณสเกลาร์)
- ด้านบน
- กรอง
มันดูดีทีเดียว ประมาณ 80% -90% ของค่าใช้จ่ายมาจากการดำเนินการดัชนีค้นหาซึ่งเหมาะ
มีกลยุทธ์ที่ดีกว่าสำหรับการค้นหาประเภทนี้หรือไม่?
ฉันไม่ต้องการลดการกรองข้อมูลเพิ่มเติมให้กับลูกค้าเพราะในบางกรณีชุดผลลัพธ์จากส่วน "แก้ไข" อาจเป็น 100 หรือ 1,000 ลูกค้าจะต้องรับผิดชอบในการเรียงลำดับและการเพจซึ่งอาจทำงานได้มากเกินไปสำหรับลูกค้า
RowNum BETWEEN 101 AND 200
?