Câu trả lời:
Câu trả lời ngắn:
Nếu khóa phân cụm sẽ không phải là một phần của bộ khóa thì tính duy nhất của chỉ mục trên tất cả các phân vùng không thể được đảm bảo.
Câu chuyện dài:
Cách duy nhất để đảm bảo tính duy nhất là thực thi tính duy nhất thông qua cấu trúc B-Tree. Với B-Tree thực sự dễ thực thi tính duy nhất, vì bất kỳ khóa nào cũng có vị trí logic xác định trong B-Tree (giữa hàng xóm bên trái của nó, đó là khóa nhỏ hơn và hàng xóm bên phải, là khóa lớn hơn). Vì mỗi giá trị khóa có thể được chèn vào một vị trí trong cây, nên tính duy nhất rất dễ đảm bảo: chỉ cần kiểm tra trong khi chèn nếu vị trí đã bị chiếm bởi một hàng hiện có.
Với tính duy nhất của phân vùng trên tất cả các phân vùng là khó khăn hơn, vì có nhiều cấu trúc B-Tree liên quan (một cho mỗi phân vùng). Mỗi cái có thể đảm bảo tính duy nhất, trong một phân vùng, nhưng cùng nhau chúng không thể đảm bảo tính duy nhất toàn cầu trên tất cả các phân vùng: một khóa trong phân vùng X cũng có thể xuất hiện trong phân vùng Y. Do đó, để duy trì ngữ nghĩa của 'chỉ mục duy nhất', cột phân cụm phải là một phần của chìa khóa Bằng cách này, mỗi giá trị khóa được liên kết nhất định với một phân vùng cụ thể: một khóa không thể xuất hiện trong phân vùng X và Y vì cột phân vùng là một phần của khóa, do đó khóa có thể thuộc chính xác phân vùng X hoặc Y.
@MarkStoreySmith đã hỏi: Vậy tại sao SQL Server không kiểm tra tính duy nhất bằng cách điều hướng từng cấu trúc của cây B, có được các khóa phạm vi mà giá trị đang được kiểm tra không tồn tại và giữ cho đến khi từng cây B được duyệt qua? Tìm kiếm mỗi B-Tree sẽ là một con lợn hiệu suất (nghĩ rằng 15.000 phân vùng sẽ được kiểm tra tại mỗi lần chèn). Và các biến chứng khóa (nhảy từ cây B này sang cây kế tiếp) cũng rất đáng kể, với tiềm năng rất lớn cho sự bế tắc.
bạn có thể tạo chỉ mục không phân cụm để căn chỉnh phân vùng hay không.
nếu bạn tạo chỉ mục phân vùng căn chỉnh, trong SQL Server 2005, phân vùng được nộp thực tế là tệp cuối cùng được nộp trong trang lá chỉ mục, mặc dù không có trong các câu lệnh tạo. Tôi đã xác minh điều này bằng cách chạy 'trang dbcc'.
Điều đó có thể đơn giản là vì chỉ mục cần được căn chỉnh với các phân vùng, vì chính chỉ mục cần được phân vùng (tức là được lưu trữ ở các vị trí riêng biệt trên ổ đĩa). Nếu chỉ mục không được căn chỉnh sẽ có con trỏ phân vùng chéo.