Câu trả lời:
Khóa chính là một khái niệm logic - đó là mã định danh duy nhất cho một hàng trong bảng. Như vậy, nó có một loạt các thuộc tính - nó có thể không rỗng, và nó phải là duy nhất. Tất nhiên, vì bạn có khả năng đang tìm kiếm các bản ghi theo số nhận dạng duy nhất của chúng, nên sẽ rất tốt nếu có một chỉ mục trên khóa chính.
Chỉ mục được phân cụm là một khái niệm vật lý - đó là một chỉ mục ảnh hưởng đến thứ tự lưu trữ các bản ghi trên đĩa. Điều này làm cho nó trở thành một chỉ mục rất nhanh khi truy cập dữ liệu, mặc dù nó có thể làm chậm quá trình ghi nếu khóa chính của bạn không phải là một số tuần tự.
Có, bạn có thể có khóa chính mà không có chỉ mục được phân cụm - và đôi khi, bạn có thể muốn (ví dụ: khi khóa chính của bạn là sự kết hợp của các khóa ngoại trên một bảng tham gia và bạn không muốn phải chịu phí xáo trộn đĩa Khi viết).
Có, bạn có thể tạo chỉ mục nhóm trên các cột không phải là khóa chính.
Một bảng có thể có khóa chính không được phân cụm và bảng được phân nhóm không yêu cầu khóa chính. Vì vậy, câu trả lời cho cả hai câu hỏi là có.
Chỉ mục theo cụm lưu trữ tất cả các cột ở cấp độ lá. Điều đó có nghĩa là một chỉ mục được phân cụm chứa tất cả dữ liệu trong bảng. Một bảng không có chỉ mục được phân cụm được gọi là một đống.
Khóa chính là một chỉ mục duy nhất được nhóm theo mặc định. Theo mặc định có nghĩa là khi bạn tạo khóa chính, nếu bảng chưa được nhóm, khóa chính sẽ được tạo dưới dạng chỉ mục duy nhất được nhóm. Trừ khi bạn chỉ định rõ ràng nonclustered
tùy chọn.
Ví dụ, trong đó t1
có khóa chính t2
không phân nhóm và không được phân nhóm nhưng có khóa chính:
create table t1 (id int not null, col1 int);
alter table t1 add constraint PK_T1 primary key nonclustered (id);
create clustered index IX_T1_COL1 on t1 (col1);
create table t2 (id int not null, col1 int);
alter table t2 add constraint PK_T2 primary key nonclustered (id);
Trước hết, hãy xem Bảng được tổ chức theo chỉ mục và Chỉ mục được phân cụm . Trên thực tế, tôi khuyên bạn nên đọc toàn bộ Sử dụng chỉ mục Luke! từ đầu cho đến khi bạn tiếp cận chủ đề phân cụm để thực sự hiểu điều gì đang xảy ra.
Bây giờ, câu hỏi của bạn ...
Một BẢNG có thể có khóa chính mà không có Chỉ mục được phân cụm không?
Có, hãy sử dụng từ khóa NONCLUSTERED khi khai báo khóa chính của bạn để tạo bảng dựa trên đống. Ví dụ:
CREATE TABLE YOUR_TABLE (
YOUR_PK int PRIMARY KEY NONCLUSTERED
-- Other fields...
);
Điều này thật đáng tiếc, vì rất nhiều người dường như chỉ chấp nhận mặc định (được ĐIỀU CHỈNH), mặc dù trong nhiều trường hợp, bảng dựa trên đống sẽ thực sự tốt hơn (như đã thảo luận trong bài viết được liên kết).
và TABLE có thể có Chỉ mục được phân cụm mà không có khóa chính không?
Không giống như một số DBMS khác, MS SQL Server sẽ cho phép bạn có một chỉ mục phân cụm khác với khóa chính, hoặc thậm chí hoàn toàn không có khóa chính.
Ví dụ sau đây tạo một chỉ mục phân cụm tách biệt với PK, có một ràng buộc DUY NHẤT ở phía trên, đó là điều bạn có thể muốn trong hầu hết các trường hợp:
CREATE TABLE YOUR_TABLE (
YOUR_PK int PRIMARY KEY,
YOUR_CLUSTERED_KEY int NOT NULL UNIQUE CLUSTERED
-- Other fields...
);
Nếu bạn chọn một chỉ mục phân nhóm không duy nhất (sử dụng CREATE CLUSTERED INDEX ...
), MS SQL Server sẽ tự động làm cho nó trở thành duy nhất bằng cách thêm một trường ẩn vào nó.
Xin lưu ý rằng các lợi ích của phân cụm có thể nhìn thấy rõ nhất đối với quét phạm vi. Nếu bạn sử dụng chỉ mục phân cụm không "phù hợp" với việc quét phạm vi được thực hiện bởi (các) ứng dụng khách của bạn (chẳng hạn như khi dựa quá nhiều vào cột ẩn được đề cập ở trên hoặc phân nhóm trên một khóa thay thế ), bạn khá đánh bại mục đích phân cụm.
Ai có thể cho tôi biết ngắn gọn mối quan hệ của khóa chính và chỉ mục nhóm được không?
Trong MS SQL Server, khóa chính cũng được nhóm theo mặc định . Bạn có thể thay đổi mặc định đó, như đã thảo luận ở trên.
Các câu trả lời được lấy từ MSDN bằng cách sử dụng các chỉ mục được phân cụm
Một BẢNG có thể có khóa chính mà không có Chỉ mục được phân cụm không? - Đúng.
Một BẢNG có thể có Chỉ mục được phân cụm mà không có khóa chính không? - Đúng.
Một khoá chính là một hạn chế để đảm bảo tính độc đáo của các giá trị, như vậy mà một hàng luôn có thể được xác định cụ thể bằng cách khóa đó.
Một chỉ số được tự động gán cho một khóa chính (như hàng thường "nhìn lên" bằng cách khóa chính của họ).
Một chỉ số phi clustered là một trật tự logic của các hàng, bởi một (hoặc nhiều hơn) các cột của nó. Hãy coi nó như một "bản sao" khác của bảng, được sắp xếp theo bất kỳ cột nào mà chỉ mục đi qua.
Một clustered index là khi thực tế bảng được thể chất theo yêu cầu của một cột cụ thể. Một bảng sẽ không phải lúc nào cũng có một chỉ mục được phân cụm (nghĩa là trong khi nó sẽ được sắp xếp theo thứ tự vật lý của một thứ gì đó , thì thứ đó có thể không được xác định ). Một bảng không thể có nhiều hơn một chỉ mục nhóm, mặc dù nó có thể có một chỉ mục nhóm tổng hợp duy nhất (tức là bảng được sắp xếp vật lý theo ví dụ: Họ, Tên, DOB).
PK thường (nhưng không phải luôn luôn) là một chỉ mục được nhóm lại.
Đối với những gì nó có thể có giá trị, trong MS SQL Server tất cả các cột trong khóa chính phải được định nghĩa là KHÔNG Null, trong khi việc tạo chỉ mục nhóm duy nhất không yêu cầu điều này. Tuy nhiên, không chắc chắn về các hệ thống DB khác.
Nó có thể không liên quan đến câu trả lời cho câu hỏi này, nhưng một số khía cạnh quan trọng về khóa chính và Chỉ mục cụm là ->
Nếu có một khóa chính (Theo Mặc định là Clustered Index, tuy nhiên chúng ta có thể thay đổi điều đó) với Clustered Index, thì chúng ta không thể tạo thêm một chỉ mục được phân cụm cho bảng đó. Nhưng nếu chưa có bộ khóa chính và có chỉ mục được phân cụm, thì chúng ta không thể tạo khóa chính với Chỉ mục được phân cụm.