Theo mặc định, PK được phân cụm và trong hầu hết các trường hợp, điều này là tốt. Tuy nhiên, câu hỏi nào nên được hỏi:
- PK của tôi có nên được nhóm lại không?
- cột nào sẽ là khóa tốt nhất cho chỉ mục được nhóm của tôi?
Chỉ số PK và Clustered là 2 điều khác biệt:
- PK là một hạn chế. PK được sử dụng để xác định các hàng duy nhất, nhưng không có khái niệm về lưu trữ. Tuy nhiên, theo mặc định (trong SSMS), nó được thi hành bởi một chỉ mục cụm duy nhất nếu chưa có chỉ mục cụm.
- Các chỉ mục được nhóm là một loại chỉ mục đặc biệt lưu trữ dữ liệu hàng ở cấp độ lá, có nghĩa là nó luôn luôn bao phủ. Tất cả các cột cho dù chúng là một phần của khóa hay không, được lưu trữ ở cấp độ lá. Nó không phải là duy nhất, trong trường hợp đó, một bộ duy nhất (4 byte) được thêm vào khóa cụm.
Bây giờ chúng tôi kết thúc với 2 câu hỏi:
- Làm cách nào để tôi xác định duy nhất các hàng trong bảng của mình (PK)
- Làm thế nào để tôi muốn lưu trữ nó ở cấp độ lá của một chỉ mục (Chỉ mục cụm)
Nó phụ thuộc vào cách:
- bạn thiết kế mô hình dữ liệu của bạn
- bạn truy vấn dữ liệu của bạn và bạn viết truy vấn của bạn
- bạn chèn hoặc cập nhật dữ liệu của bạn
- ...
Đầu tiên, bạn có cần một chỉ số cụm? Nếu bạn chèn số lượng lớn, sẽ hiệu quả hơn khi lưu trữ dữ liệu không có thứ tự vào HEAP (so với dữ liệu được sắp xếp trong một cụm). Nó sử dụng RID (Định danh hàng, 8 byte) để xác định duy nhất các hàng và lưu trữ nó trên các trang.
Chỉ số cụm không nên là một giá trị ngẫu nhiên. Dữ liệu ở cấp độ lá sẽ được lưu trữ và sắp xếp theo khóa chỉ mục. Do đó, nó nên phát triển liên tục để tránh phân mảnh hoặc chia trang. Nếu PK không thể đạt được điều này, bạn nên xem xét một khóa khác như một ứng cử viên. Chỉ mục được nhóm trên các cột nhận dạng, GUID tuần tự hoặc thậm chí một cái gì đó như ngày chèn là tốt từ quan điểm tuần tự vì tất cả các hàng sẽ được thêm vào trang lá cuối cùng. Mặt khác, mặc dù số nhận dạng duy nhất có thể hữu ích cho nhu cầu kinh doanh của bạn dưới dạng PK, nhưng chúng không nên được phân cụm (chúng được sắp xếp / tạo ngẫu nhiên).
Nếu sau khi phân tích một số dữ liệu và truy vấn, bạn phát hiện ra rằng bạn chủ yếu sử dụng cùng một chỉ mục để lấy dữ liệu của mình trước khi thực hiện tra cứu khóa trong PK cụm, bạn có thể coi đó là chỉ mục cụm mặc dù nó có thể không xác định duy nhất dữ liệu của bạn.
Khóa chỉ mục được nhóm bao gồm tất cả các cột bạn muốn lập chỉ mục. Một cột duy nhất (4 byte) được thêm vào nếu không có ràng buộc duy nhất nào trên nó (giá trị gia tăng cho các bản sao, nếu không thì khác). Khóa chỉ mục này sau đó sẽ được lưu trữ một lần cho mỗi hàng ở cấp độ lá của tất cả các chỉ mục không bao gồm của bạn. Một số trong số chúng cũng sẽ được lưu trữ nhiều lần ở các cấp trung gian (nhánh) giữa gốc và cấp lá của cây chỉ mục (cây B). Nếu khóa quá lớn, tất cả các chỉ mục không được phân cụm sẽ trở nên lớn hơn, sẽ cần nhiều bộ nhớ hơn và nhiều IO, CPU, bộ nhớ, ... Nếu bạn có PK về tên + ngày sinh + quốc gia, rất có khả năng khóa này không phải là một ứng cử viên tốt Nó là quá lớn cho một chỉ số cụm. Trình nhận dạng duy nhất sử dụng NEWSEQUENTIALID () thường không được coi là một khóa hẹp (16 byte) mặc dù nó là tuần tự.
Sau đó, khi bạn tìm ra cách xác định duy nhất các hàng trong bảng của mình, bạn có thể thêm PK. Nếu bạn nghĩ rằng bạn sẽ không sử dụng nó trong truy vấn của mình, đừng tạo nó thành cụm. Bạn vẫn có thể tạo một chỉ mục không bao gồm khác nếu đôi khi bạn cần truy vấn nó. Lưu ý rằng PK sẽ tự động tạo ra một chỉ mục duy nhất.
Các chỉ mục không được phân cụm sẽ luôn chứa khóa được phân cụm. Tuy nhiên, nếu các cột được lập chỉ mục (+ cột chính) đang che, sẽ không có bất kỳ tra cứu khóa nào trong chỉ mục được nhóm. Đừng quên bạn cũng có thể thêm Bao gồm và Vị trí vào một chỉ mục không được nhóm. (sử dụng nó một cách rộng rãi)
Chỉ mục cụm nên là duy nhất và càng hẹp càng tốt Chỉ mục cụm không nên thay đổi theo thời gian và nên được chèn tăng dần.
Bây giờ là lúc để viết một số SQL sẽ tạo bảng, các chỉ mục và các ràng buộc không được bao gồm và không được bao gồm.
Đây chỉ là lý thuyết vì chúng tôi không biết mô hình dữ liệu và kiểu dữ liệu của bạn được sử dụng (A và B).