Mối quan hệ của Khóa chính và Chỉ mục theo cụm


91

Có thể TABLEcó khóa chính mà không có chỉ mục được phân cụm không?

Và có thể TABLEcó một chỉ mục được phân cụm mà không cần có khóa chính không?

Ai có thể cho tôi biết ngắn gọn mối quan hệ giữa khóa chính và chỉ mục nhóm được không?

Câu trả lời:


102

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.


1
Chào. Chủ đề đã cũ, nhưng có lẽ ai đó có thể trả lời câu hỏi của tôi. Nếu cột được khai báo là KHÔNG ĐẦY ĐỦ CHỈ SỐ ĐƯỢC ĐIỀU CHỈNH ĐỘC ĐÁO, thì việc đặt nó là CHÌA KHÓA CHÍNH có thực hiện bất kỳ thay đổi thực tế nào về hiệu suất hay bất kỳ điều gì không?
jesse

Đó là một câu hỏi thú vị. Tôi sẽ giả sử là không, vì nó phải thực hiện tất cả các kiểm tra theo cách giống nhau.
Jonathan Allen

Câu trả lời tuyệt vời.
NikosV

Nhưng hầu hết , một cột khóa chính với một chỉ mục được phân cụm sẽ hữu ích vì nó đơn giản hóa phạm vi tìm kiếm rất nhiều.
hunter_tech

33

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 nonclusteredtùy chọn.

Ví dụ, trong đó t1có khóa chính t2khô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);

Ví dụ tại SQL Fiddle.


18

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.


4

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.


Trong SQL Server, khóa chính sẽ được nhóm theo mặc định - trừ khi bạn nói rõ ràng là không được. Nhưng đó chỉ là mặc định - không phải là bắt buộc.
marc_s

Một bảng có thể có khóa chính mà không có bất kỳ chỉ mục nào không? Bởi vì, khi tôi nói rằng một cột là khóa chính, theo mặc định là chỉ mục được tạo nhóm. Khi xóa chỉ mục, bảng không chứa khóa chính nữa?
veljasije,

1

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


Đây là một bình luận bên dưới câu trả lời được đánh dấu là đúng.
Jan Doggen

1
Chào mừng bạn - Tôi cho bạn một +1 vì tôi thấy bạn chưa có đủ danh tiếng để thêm nhận xét. (Đã ở đó, đã thực hiện điều đó :)
Kỹ sư đảo ngược

0

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.

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.