Có sự khác biệt hữu hình nào giữa một chỉ mục cụm duy nhất và khóa chính được phân cụm không?


17

Tôi hiểu rằng có thể có sự khác biệt về ý nghĩa hoặc ý định giữa hai loại này, nhưng có sự khác biệt về hành vi hoặc hiệu suất giữa khóa chính được phân cụm và chỉ mục duy nhất được phân cụm không?

Câu trả lời:


15

Một điểm khác biệt chính là chỉ mục duy nhất có thể có giá trị NULL không được phép trong khóa chính. Phân cụm hay không, đây là điểm khác biệt chính giữa việc triển khai thực tế Khóa chính so với Khóa duy nhất.

Ồ, và thực tế là một bảng có thể có một PK và nhiều Vương quốc Anh :-).

Đây là cả hai sự khác biệt trong INTENT không phải trong HIỆU SUẤT. Mặt khác, tôi không nghĩ có sự khác biệt nào. Đằng sau bất kỳ PK hoặc UK, SQL Server sẽ tạo một chỉ mục (tùy thuộc vào yêu cầu, được nhóm hay không) và cách thức sử dụng là minh bạch cho nguồn phát sinh.


Vì vậy, không có lý do gì để sử dụng PK, ngoại trừ (A) làm bí danh cho NOT NULL UNIQUE CLUSTEREDhoặc (B) để làm nổi bật rằng một UQ cụ thể là "đặc biệt" theo nghĩa siêu dữ liệu, mặc dù RDMS là bất khả tri?
Jon của tất cả các giao dịch

Vâng, một cái gì đó như thế, tôi sẽ tự mình lựa chọn B :-).
Mary

Có một lý do - để ngăn bạn sử dụng giá trị đặc biệt NULL khi không phù hợp!
JamesRyan

@JamesRyan: Điều đó được bao phủ bởi lý do của Jon of All Trades #A.
Andriy M

1
@JamesRyan: Có, giữa PRIMARY KEYNOT NULL UNIQUE, cái trước sẽ khó biến thành hơn nhiều NULL UNIQUE(đặc biệt nếu ràng buộc đã được tham chiếu bởi khóa ngoại). Chắc chắn sẽ ngăn chặn những thay đổi tình cờ từ NOT NULLđến NULL.
Andriy M

8

Giữa một khóa chính được phân cụm và một chỉ mục được phân cụm duy nhất, không có bất kỳ khác biệt nào ngoài chỉ mục được phân cụm duy nhất có thể có giá trị NULL.

Một chỉ mục cụm không duy nhất có một bộ xác định duy nhất phải được xử lý cho các giá trị không duy nhất.


Bạn có nghĩa là các chỉ mục tiếp theo trên bảng đó trỏ trực tiếp đến các hàng trong chỉ mục được nhóm bỏ qua chỉ mục được tạo bởi khóa chính?
bernd_k

1
Đúng rồi. Các chỉ mục không phân cụm sẽ trỏ đến khóa phân cụm, không phải khóa chính. Nếu khóa chính là khóa không được phân cụm thì tất cả những gì nó làm là thực thi tính duy nhất trên một cột không hỗ trợ các giá trị NULL để có thể sử dụng nó thông qua khóa ngoại.
mrdenny
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.