Một lý do để thích INCLUDE
hơn các cột khóa nếu bạn không cần cột đó trong khóa là tài liệu. Điều đó làm cho việc phát triển các chỉ số dễ dàng hơn nhiều trong tương lai.
Xem xét ví dụ của bạn:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Chỉ mục đó là tốt nhất nếu truy vấn của bạn trông như thế này:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
Tất nhiên, bạn không nên đặt các cột vào INCLUDE
nếu bạn có thể nhận được một lợi ích bổ sung từ việc có chúng trong phần chính. Cả hai truy vấn sau đây thực sự sẽ thích col2
cột trong khóa của chỉ mục.
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
Chúng ta hãy giả sử rằng đây không phải là trường hợp và chúng ta có col2
trong INCLUDE
mệnh đề bởi vì không có lợi ích gì khi có nó trong phần cây của chỉ mục.
Nhanh chóng chuyển tiếp một số năm.
Bạn cần điều chỉnh truy vấn này:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
Để tối ưu hóa truy vấn đó, chỉ mục sau sẽ rất tuyệt:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
Nếu bạn kiểm tra những chỉ mục nào bạn có trên bảng đó, chỉ mục trước đó của bạn vẫn có thể ở đó:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Bây giờ bạn biết rằng Col2
và Col3
không phải là một phần của cây chỉ mục và do đó không được sử dụng để thu hẹp phạm vi chỉ mục đọc cũng như để sắp xếp các hàng. Là khá an toàn để thêm another_column
vào cuối phần chính của chỉ mục (sau col1
). Có rất ít rủi ro để phá vỡ bất cứ điều gì:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
Chỉ số đó sẽ trở nên lớn hơn, vẫn còn một số rủi ro, nhưng nói chung là tốt hơn để mở rộng các chỉ mục hiện có so với việc giới thiệu các chỉ số mới.
Nếu bạn có một chỉ mục mà không có INCLUDE
, bạn không thể biết những truy vấn nào bạn sẽ phá vỡ bằng cách thêm another_col
ngay sau đó Col1
.
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
Điều gì xảy ra nếu bạn thêm another_col
giữa Col1
và Col2
? Các truy vấn khác sẽ bị?
Có những "lợi ích" khác INCLUDE
so với các cột chính nếu bạn thêm các cột đó chỉ để tránh tìm nạp chúng từ bảng . Tuy nhiên, tôi coi khía cạnh tài liệu là quan trọng nhất.
Để trả lời câu hỏi của bạn:
hướng dẫn nào bạn muốn đề xuất trong việc xác định có nên tạo chỉ mục bao phủ có hoặc không có mệnh đề INCLUDE?
Nếu bạn thêm một cột vào chỉ mục cho mục đích duy nhất là có sẵn cột đó trong chỉ mục mà không cần truy cập vào bảng, hãy đặt nó vào INCLUDE
mệnh đề.
Nếu việc thêm cột vào khóa chỉ mục mang lại lợi ích bổ sung (ví dụ: order by
hoặc vì nó có thể thu hẹp phạm vi chỉ mục đọc), hãy thêm nó vào khóa.
Bạn có thể đọc một cuộc thảo luận dài hơn về điều này ở đây:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes