Đ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:
SELECT *
FROM mytable
ORDER BY
col1 DESC, col2
, nhưng không dành cho:
SELECT *
FROM mytable
ORDER BY
col1, col2
Chỉ mục trên một cột có thể được sử dụng 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:
- Chỉ mục giảm dần
Cập nhật:
Trên 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 bảng 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ó thứ tự của col1
cùng với các tham chiếu đến các hàng.
Vì bảng được phân nhóm nên các tham chiếu đến các hàng thực sự là giá trị của pk
. Chúng cũng được sắp xếp theo từng 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 sắp xếp trên (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 đó là các giá trị của col1
sẽ được sắp xếp giảm dần, nhưng các giá trị của pk
trong mỗi giá trị của 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 đó.