Đưa ra một số bảng có khóa chính, vd:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
chúng tôi có một khóa chính duy nhất trên CustomerID
.
Theo truyền thống, sau đó tôi có thể cần một số chỉ số bao gồm bổ sung; ví dụ để nhanh chóng tìm thấy người dùng bằng cách CustomerID
hoặc Email
:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
Và đây là những loại chỉ mục tôi đã tạo ra trong nhiều thập kỷ.
Nó không bắt buộc phải là duy nhất, nhưng thực ra nó là
Chỉ mục tồn tại để tránh quét bảng; nó là một chỉ số bao trùm để hỗ trợ hiệu suất (chỉ số không có ở đó như một ràng buộc để thực thi tính duy nhất).
Hôm nay tôi nhớ một mẩu thông tin - SQL Server có thể sử dụng thực tế rằng:
- một cột có ràng buộc khóa ngoại
- một cột có một chỉ mục duy nhất
- một ràng buộc là đáng tin cậy
để giúp nó tối ưu hóa việc thực hiện truy vấn của mình. Trong thực tế, từ Hướng dẫn thiết kế chỉ mục SQL Server :
Nếu dữ liệu là duy nhất và bạn muốn thực thi tính duy nhất, việc tạo một chỉ mục duy nhất thay vì chỉ mục nonunique trên cùng một cột cung cấp thông tin bổ sung cho trình tối ưu hóa truy vấn có thể tạo ra các kế hoạch thực hiện hiệu quả hơn . Tạo một chỉ mục duy nhất (tốt nhất là bằng cách tạo một ràng buộc ĐỘC ĐÁO) được khuyến nghị trong trường hợp này.
Cho rằng chỉ mục nhiều cột của tôi chứa khóa chính, chỉ số tổng hợp này trên thực tế sẽ là duy nhất. Đây không phải là một ràng buộc mà tôi đặc biệt cần SQL Server để thực thi trong mỗi lần chèn hoặc cập nhật; nhưng thực tế là chỉ số không phân cụm này là duy nhất.
Có bất kỳ lợi thế nào trong việc đánh dấu chỉ số duy nhất trên thực tế này là thực sự duy nhất không?
TẠO ĐỘC LẬP ĐỘC LẬP IX_Customers_CustomerIDEmail TRÊN khách hàng ( ID khách hàng, E-mail )
Dường như với tôi, SQL Server có thể đủ thông minh để nhận ra rằng chỉ mục của tôi là duy nhất nhờ thực tế là nó chứa khóa chính.
- Nhưng có lẽ nó không biết điều này và có một lợi thế cho trình tối ưu hóa nếu tôi tuyên bố chỉ số là duy nhất.
- Ngoại trừ có lẽ điều đó có thể dẫn đến sự chậm lại trong quá trình chèn và cập nhật, nơi nó phải thực hiện kiểm tra tính duy nhất - nơi mà trước đây nó chưa bao giờ phải thực hiện.
- Trừ khi nó biết chỉ số được đảm bảo là duy nhất, bởi vì nó chứa khóa chính.
Tôi không thể tìm thấy bất kỳ hướng dẫn nào từ Microsoft về việc cần làm khi chỉ mục tổng hợp chứa khóa chính.
Lợi ích của các chỉ mục duy nhất bao gồm:
- Tính toàn vẹn dữ liệu của các cột được xác định được đảm bảo.
- Thông tin bổ sung hữu ích cho trình tối ưu hóa truy vấn được cung cấp.
Tôi có nên đánh dấu một chỉ mục tổng hợp là duy nhất nếu nó đã chứa khóa chính? Hoặc SQL Server có thể tự tìm ra điều này không?