SQL Server - Khi nào sử dụng Clustered và non-Clustered Index?


99

Tôi biết sự khác biệt cơ bản giữa các chỉ mục được phân nhóm và không được phân nhóm và hiểu về cách chúng thực sự hoạt động. Tôi hiểu cách các chỉ mục được phân nhóm và không phân cụm cải thiện hiệu suất đọc. Nhưng có một điều tôi không chắc là đâu sẽ là lý do mà tôi chọn cái này hơn cái kia.

Ví dụ: Nếu một bảng không có chỉ mục được phân cụm, người ta có nên tạo chỉ mục không được phân cụm và lợi ích của việc làm là gì


3
Cảm ơn vì đã phản hồi. Tôi đã nhận thức được điều đó. Câu hỏi của tôi là liệu có tình huống tạo chỉ mục không phân cụm sẽ có lợi hơn tạo chỉ mục được phân cụm không
armulator

2
Có, bạn nên tránh một chỉ mục được phân cụm khi; cột có số lượng thấp, không có thứ tự cụ thể, được cập nhật thường xuyên, không theo trình tự, nó là sự kết hợp của nhiều cột ...
TI

Cảm ơn câu trả lời của bạn. Nó hữu ích
armulator

1
Có lẽ câu hỏi này sẽ giúp bạn: stackoverflow.com/questions/5070529/…
David García González,

Câu trả lời:


117

Tôi chỉ muốn đưa ra một lời cảnh báo: vui lòng chọn chỉ mục theo nhóm của bạn thật cẩn thận ! Mọi bảng dữ liệu "thông thường" phải có một chỉ mục được phân cụm, vì việc có một chỉ mục được phân nhóm thực sự sẽ tăng tốc rất nhiều hoạt động - vâng, tăng tốc , thậm chí là chèn và xóa! Nhưng chỉ khi bạn chọn một chỉ mục được phân nhóm tốt .

Đây là cấu trúc dữ liệu được sao chép nhiều nhất trong cơ sở dữ liệu SQL Server của bạn. Khóa phân cụm cũng sẽ là một phần của mỗi và mọi chỉ mục không phân cụm trên bảng của bạn.

Bạn nên hết sức cẩn thận khi chọn khóa phân cụm - nó phải là:

  • hẹp (4 byte lý tưởng)

  • duy nhất (xét cho cùng thì đó là "con trỏ hàng". Nếu bạn không đặt nó là duy nhất, SQL Server sẽ làm điều đó cho bạn ở chế độ nền, khiến bạn tốn một vài byte cho mỗi mục nhập nhân với số hàng và số chỉ số không phân biệt bạn có - điều này có thể rất tốn kém!)

  • static (không bao giờ thay đổi - nếu có thể)

  • ngày càng tăng lý tưởng để bạn sẽ không gặp phải tình trạng phân mảnh chỉ mục khủng khiếp (GUID hoàn toàn trái ngược với một khóa phân cụm tốt - vì lý do cụ thể đó)

  • nó phải là không thể nullable và lý tưởng cũng là chiều rộng cố định - a varchar(250)tạo ra một khóa phân cụm rất kém

Bất cứ điều gì khác thực sự phải là cấp độ quan trọng thứ hai và thứ ba sau những điểm này ....

Xem một số bài đăng trên blog của Kimberly Tripp ( Nữ hoàng lập chỉ mục ) về chủ đề này - bất cứ điều gì cô ấy viết trên blog của mình đều hoàn toàn vô giá - hãy đọc nó, đọc nó - sống bằng nó!


1
Cảm ơn marc_s đã giải thích rõ ràng. Nhưng về mặt kỹ thuật, non clusteredchỉ số làm gì cho chúng ta. tầm quan trọng của nó là gì ..?
hud

@nad: chỉ mục không phân cụm được chọn tốt có thể tăng tốc tìm kiếm của bạn - thay vì phải so sánh hàng triệu hàng dữ liệu có khả năng với tiêu chí tìm kiếm của mình, bạn có thể tìm thấy một hàng nhất định chỉ với 4,5 lần so sánh. Điều đó tạo nên sự khác biệt LỚN !
marc_s

1
@MuriloKunze: đọc bài đăng trên blog của Kim Tripp về chủ đề này - cô ấy giải thích rất chi tiết tại sao lại như vậy
marc_s

5
Tôi rất tiếc, nhưng đâu là câu trả lời cho câu hỏi "SQL Server - Khi nào thì sử dụng Chỉ mục phân cụm so với không phân cụm?" ?
Eduard
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.