Như Remus nói nó phụ thuộc vào khối lượng công việc của bạn.
Tôi muốn giải quyết một khía cạnh sai lệch của câu trả lời được chấp nhận mặc dù.
Đối với các truy vấn đang thực hiện tìm kiếm bình đẳng trên tất cả các cột trong chỉ mục, không có sự khác biệt đáng kể.
Dưới đây tạo ra hai bảng và điền chúng với dữ liệu giống hệt nhau. Sự khác biệt duy nhất là một cái có các khóa được sắp xếp từ hầu hết đến ít chọn lọc và cái còn lại thì ngược lại.
CREATE TABLE Table1(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE TABLE Table2(MostSelective char(800), SecondMost TINYINT, Least CHAR(1), Filler CHAR(4000) null);
CREATE NONCLUSTERED INDEX MyINDX on Table1(MostSelective,SecondMost,Least);
CREATE NONCLUSTERED INDEX MyINDX2 on Table2(Least,SecondMost,MostSelective);
INSERT INTO Table1 (MostSelective, SecondMost, Least)
output inserted.* into Table2
SELECT TOP 26 REPLICATE(CHAR(number + 65),800), number/5, '~'
FROM master..spt_values
WHERE type = 'P' AND number >= 0
ORDER BY number;
Bây giờ thực hiện một truy vấn đối với cả hai bảng ...
SELECT *
FROM Table1
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
SELECT *
FROM Table2
WHERE MostSelective = REPLICATE('P', 800)
AND SecondMost = 3
AND Least = '~';
... Cả hai đều sử dụng một chỉ số tốt và cả hai đều được cung cấp cùng một chi phí.
Nghệ thuật ASCII trong câu trả lời được chấp nhận thực tế không phải là cách các chỉ mục được cấu trúc. Các trang chỉ mục cho Bảng 1 được trình bày bên dưới (nhấp vào hình ảnh để mở ở kích thước đầy đủ).
Các trang chỉ mục chứa các hàng chứa toàn bộ khóa (trong trường hợp này thực sự có một cột khóa bổ sung được gắn cho mã định danh hàng vì chỉ mục không được khai báo là duy nhất nhưng có thể bỏ qua thông tin thêm về điều này có thể được tìm thấy ở đây ).
Đối với truy vấn trên, SQL Server không quan tâm đến tính chọn lọc của các cột. Nó thực hiện tìm kiếm nhị phân của trang gốc và phát hiện ra rằng Key (PPP...,3,~ )
là >=(JJJ...,1,~ )
và < (SSS...,3,~ )
vì vậy nó nên đọc trang 1:118
. Sau đó, nó thực hiện tìm kiếm nhị phân của các mục chính trên trang đó và định vị trang lá để di chuyển xuống.
Việc thay đổi chỉ mục theo thứ tự chọn lọc không ảnh hưởng đến số lượng so sánh chính dự kiến từ tìm kiếm nhị phân hoặc số trang cần điều hướng để thực hiện tìm kiếm chỉ mục. Tốt nhất là nó có thể tăng tốc độ so sánh chính nó.
Đôi khi, việc sắp xếp chỉ mục chọn lọc nhất trước tiên sẽ có ý nghĩa đối với các truy vấn khác trong khối lượng công việc của bạn.
Ví dụ: nếu khối lượng công việc chứa các truy vấn của cả hai hình thức sau.
SELECT * ... WHERE MostSelective = 'P'
SELECT * ...WHERE Least = '~'
Các chỉ số ở trên không bao gồm một trong hai. MostSelective
đủ chọn lọc để thực hiện một kế hoạch với tìm kiếm và tra cứu đáng giá nhưng truy vấn Least
không được.
Tuy nhiên, kịch bản này (không bao gồm tìm kiếm chỉ mục trên tập hợp con của cột hàng đầu của một chỉ mục tổng hợp) chỉ là một loại truy vấn có thể có thể được trợ giúp bởi một chỉ mục. Nếu bạn không bao giờ thực sự tự mình tìm kiếm MostSelective
hoặc kết hợp MostSelective, SecondMost
và luôn luôn tìm kiếm theo sự kết hợp của cả ba cột thì lợi thế về mặt lý thuyết này là vô ích đối với bạn.
Ngược lại các truy vấn như
SELECT MostSelective,
SecondMost,
Least
FROM Table2
WHERE Least = '~'
ORDER BY SecondMost,
MostSelective
Sẽ được giúp đỡ bằng cách có thứ tự ngược lại của quy định thường được quy định - vì nó bao gồm truy vấn, có thể hỗ trợ tìm kiếm và trả về các hàng theo thứ tự mong muốn để khởi động.
Vì vậy, đây là một lời khuyên thường được lặp đi lặp lại nhưng nhiều nhất nó là một câu hỏi về lợi ích tiềm năng đối với các truy vấn khác - và nó không thay thế cho việc thực sự xem xét khối lượng công việc của bạn .