chỉ mục duy nhất không phân cụm trên phân vùng máy chủ sql


7

SQL Server 2008 yêu cầu các chỉ mục không phân cụm duy nhất được tạo trên một phân vùng để bao gồm trường phân vùng trong định nghĩa chỉ mục.

Tôi đang tự hỏi tại sao.

Câu trả lời:


7

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.


1
Do đó, "vì có nhiều cấu trúc B-Tree liên quan ..." là thủ phạm thực sự theo quan điểm của tôi. Nếu tôi muốn một chỉ mục duy nhất không có trường được phân vùng thì tôi không nên buộc phải bao gồm trường được phân vùng.
bmk

1
@bmk: sau đó tạo một chỉ mục duy nhất không phân vùng :) Tôi hiểu rằng không có giải pháp hoàn hảo (tạm biệt chuyển đổi phân vùng nhanh!), nhưng đây là (một trong) giá bạn phải trả khi bạn chọn phân vùng. Không phải là một bữa ăn trưa miễn phí, và 'giá' thực sự lớn hơn đáng kể so với hầu hết nhận ra. Và, như bạn thấy, giá thực sự có thể làm lu mờ tất cả các mô hình dữ liệu (khóa chính phải bao gồm cột phân vùng), có ý nghĩa rất lớn đối với lớp ORM, v.v. Tôi luôn khuyên bạn nên cân nhắc cẩn thận khi xem xét phân vùng.
Remus Rusanu

0

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'.


Xin lỗi, không chắc tôi hiểu những gì bạn đang giải thích.
bmk

0

Đ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.