Như thông báo lỗi cho biết, bất kỳ chỉ mục duy nhất phù hợp với phân vùng phải bao gồm khóa phân vùng trong khóa chỉ mục. Yêu cầu này tồn tại để động cơ có thể thực thi tính duy nhất trên các bản cập nhật mà không cần kiểm tra mọi phân vùng.
Trong trường hợp của bạn, điều này có nghĩa là bao gồm OrderDate
trong khóa chỉ mục không bao gồm hoặc có chỉ mục không liên kết. Cả hai đều có khả năng lựa chọn hợp lệ, tùy thuộc vào hoàn cảnh của bạn. Để duy trì căn chỉnh, định nghĩa bảng và chỉ mục của bạn sẽ là:
CREATE TABLE dbo.Orders
(
OrderID integer NOT NULL,
Name nvarchar(20) NULL,
OrderDate date NOT NULL,
CONSTRAINT PK__Orders_OrderID_OrderDate
PRIMARY KEY NONCLUSTERED
(OrderID, OrderDate)
ON PS (OrderDate)
)
ON PS (OrderDate);
GO
CREATE CLUSTERED INDEX CX__Orders_OrderDate
ON dbo.Orders (OrderDate)
ON PS (OrderDate);
Tất nhiên điều này thay đổi tính duy nhất mà chỉ mục không bao gồm thực thi. Bây giờ, chỉ có sự kết hợp OrderID
và OrderDate
được đảm bảo là duy nhất. Về mặt lý thuyết có thể thêm OrderID
các s trùng lặp , miễn OrderDate
là khác nhau. Việc thay đổi ngữ nghĩa này có được bạn chấp nhận hay không tùy thuộc vào hoàn cảnh của bạn, nhưng đó là điều cần lưu ý.
Thay thế là có khóa chính không được bao gồm không được căn chỉnh:
CREATE TABLE dbo.Orders
(
OrderID integer NOT NULL,
Name nvarchar(20) NULL,
OrderDate date NOT NULL,
CONSTRAINT PK__Orders_OrderID
PRIMARY KEY NONCLUSTERED
(OrderID)
ON [PRIMARY]
)
ON PS (OrderDate);
GO
CREATE CLUSTERED INDEX CX__Orders_OrderDate
ON dbo.Orders (OrderDate)
ON PS (OrderDate);
Điều này duy trì tính duy nhất của OrderID
một mình và có một số lợi ích với các truy vấn tính toán MIN
hoặc MAX
tổng hợp bằng cách sử dụng chỉ mục, nhưng bạn mất khả năng SWITCH
phân vùng vào và ra mà không bỏ khóa chính và tạo lại nó sau thao tác chuyển đổi.
Bạn có thể đọc thêm về phân vùng trong phần Sách trực tuyến này và nhiều hơn về các vấn đề về chỉ mục được căn chỉnh và không liên kết trong câu trả lời xuất sắc này của Remus Rusanu.