Tôi chỉ muốn chắc chắn rằng tôi đang đi đúng hướng với các khái niệm này, vì vậy mọi phản hồi sẽ được đánh giá rất cao.
Đây là lý thuyết của tôi từ truy vấn tôi vừa tối ưu hóa, thông qua quá trình thử và sai và đọc tài liệu MSDN.
Truy vấn
DECLARE @pic_id int
SET pic_id = 1
SELECT ROW_NUMBER() OVER (ORDER BY pic_date desc) AS row_num, *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND (hidden = 0 OR pic_id = @pic_id)
Chỉ số
CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics]
(
[map_id] ASC,
[deleted] ASC,
[pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Ngoài ra còn có một chỉ số PK trên pic_id
Học thuyết
Các cột chính là như vậy, bởi vì chúng được sử dụng trong mệnh đề WHERE (nhưng không được sử dụng trong tình huống OR) hoặc ORDER BY.
Các cột không khóa (INCLUDE) là như vậy, vì chúng được sử dụng trong WHERE, nhưng vì chúng được sử dụng trong kịch bản OR nên chúng không thể (không thể cải thiện hiệu suất) là một cột chính.
Những giả định này có đúng không? Nếu không, tôi còn thiếu gì?
Cảm ơn!