Điều này chủ yếu quan trọng khi được sử dụng với các chỉ mục tổng hợp:
CREATE INDEX ix_index ON mytable (col1, col2 DESC);
có thể được sử dụng cho một trong hai:
SELECT *
FROM mytable
ORDER BY
col1, col2 DESC
hoặc là:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, nhưng không phải cho:
SELECT *
FROM mytable
ORDER BY
col1, col2
Một chỉ mục trên một cột có thể được sử dụng một cách hiệu quả để sắp xếp theo cả hai cách.
Xem bài viết trong blog của tôi để biết chi tiết:
Cập nhật:
Trong thực tế, điều này có thể quan trọng ngay cả đối với một chỉ mục cột, mặc dù nó không quá rõ ràng.
Hãy tưởng tượng một chỉ mục trên một cột của một bảng được nhóm:
CREATE TABLE mytable (
pk INT NOT NULL PRIMARY KEY,
col1 INT NOT NULL
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
Chỉ mục trên col1
giữ các giá trị được sắp xếp col1
cùng với các tham chiếu đến các hàng.
Vì bảng được nhóm, các tham chiếu đến các hàng thực sự là các giá trị của pk
. Họ cũng được sắp xếp trong mỗi giá trị của col1
.
Điều này có nghĩa là các lá của chỉ mục thực sự được đặt hàng (col1, pk)
và truy vấn này:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk
không cần phân loại.
Nếu chúng ta tạo chỉ mục như sau:
CREATE INDEX ix_mytable_col1_desc ON mytable (col1 DESC)
, sau đó các giá trị của col1
sẽ được sắp xếp giảm dần, nhưng các giá trị pk
bên trong mỗi giá trị col1
sẽ được sắp xếp tăng dần.
Điều này có nghĩa là truy vấn sau:
SELECT col1, pk
FROM mytable
ORDER BY
col1, pk DESC
có thể được phục vụ bởi ix_mytable_col1_desc
nhưng không phải bởi ix_mytable_col1
.
Nói cách khác, các cột tạo thành một CLUSTERED INDEX
trên bất kỳ bảng nào luôn là các cột theo sau của bất kỳ chỉ mục nào khác trên bảng đó.