Chỉ số Clustered và Non clustered thực sự có nghĩa là gì?


1119

Tôi tiếp xúc hạn chế với DB và chỉ sử dụng DB làm lập trình viên ứng dụng. Tôi muốn biết về ClusteredNon clustered indexes. Tôi googled và những gì tôi tìm thấy là:

Một chỉ mục được nhóm là một loại chỉ mục đặc biệt sắp xếp lại cách các bản ghi trong bảng được lưu trữ vật lý. Do đó bảng chỉ có thể có một chỉ mục cụm. Các nút lá của một chỉ mục được nhóm chứa các trang dữ liệu. Một chỉ mục không bao gồm là một loại chỉ mục đặc biệt trong đó thứ tự logic của chỉ mục không khớp với thứ tự lưu trữ vật lý của các hàng trên đĩa. Nút lá của một chỉ mục không bao gồm không bao gồm các trang dữ liệu. Thay vào đó, các nút lá chứa các hàng chỉ mục.

Những gì tôi tìm thấy trong SO là sự khác biệt giữa chỉ số cụm và chỉ số không cụm là gì? .

Ai đó có thể giải thích điều này bằng tiếng Anh đơn giản?

Câu trả lời:


1118

Với một chỉ mục được nhóm, các hàng được lưu trữ vật lý trên đĩa theo cùng thứ tự với chỉ mục. Do đó, chỉ có thể có một chỉ số cụm.

Với một chỉ mục không được nhóm, có một danh sách thứ hai có con trỏ tới các hàng vật lý. Bạn có thể có nhiều chỉ mục không được nhóm, mặc dù mỗi chỉ mục mới sẽ tăng thời gian cần thiết để viết các bản ghi mới.

Nói chung là nhanh hơn để đọc từ một chỉ mục được nhóm nếu bạn muốn lấy lại tất cả các cột. Bạn không cần phải đi đầu tiên đến chỉ mục và sau đó đến bảng.

Viết vào một bảng với một chỉ mục được nhóm có thể chậm hơn, nếu có nhu cầu sắp xếp lại dữ liệu.


43
Bạn nên làm rõ những gì bạn có nghĩa là "vật lý".
Spencer Ruport

142
vật lý như trong các bit thực tế được lưu trữ trên đĩa
Peter

17
Tham khảo msd "Khi bạn tạo một ràng buộc CHÍNH CHÍNH, một chỉ mục được nhóm duy nhất trên cột hoặc cột được tạo tự động nếu không tồn tại một chỉ mục cụm trên bảng", điều đó có nghĩa là không nhất thiết phải là cùng một cột.
Minh

46
@Pete không phải vậy. SQL Server chắc chắn không đảm bảo rằng tất cả các tệp dữ liệu được đặt trong một vùng vật lý liền kề của đĩa và không có sự phân mảnh hệ thống tệp nào. Thậm chí không đúng khi một chỉ mục được nhóm theo thứ tự trong tệp dữ liệu. Mức độ mà điều này không phải là trường hợp là mức độ phân mảnh hợp lý.
Martin Smith

42
Chỉ cần một nhận xét nhanh để sao lưu quan điểm của Martin Smith - các chỉ mục được nhóm không đảm bảo lưu trữ tuần tự trên đĩa. Quản lý chính xác nơi dữ liệu được đặt trên đĩa là công việc của HĐH, không phải DBMS. Nhưng nó gợi ý rằng các mục được sắp xếp theo khóa chung. Điều này có nghĩa là nếu DB tăng thêm 10GB, chẳng hạn, HĐH có thể quyết định đặt 10GB đó trong các đoạn 5x2GB trên các phần khác nhau của đĩa. Một bảng được phân cụm bao gồm 10 GB sẽ được lưu trữ liên tục trên mỗi khối 2 GB, tuy nhiên các khối 2 GB đó KHÔNG THỂ là tuần tự.
blobble

601

Một chỉ mục được nhóm có nghĩa là bạn đang bảo cơ sở dữ liệu lưu trữ các giá trị gần thực sự gần nhau trên đĩa. Điều này có lợi ích của việc quét / truy xuất nhanh các bản ghi rơi vào một số phạm vi của các giá trị chỉ mục được nhóm.

Ví dụ: bạn có hai bảng, Khách hàng và Đặt hàng:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

Nếu bạn muốn nhanh chóng truy xuất tất cả các đơn đặt hàng của một khách hàng cụ thể, bạn có thể muốn tạo một chỉ mục được nhóm trên cột "CustomerID" của bảng Đơn hàng. Bằng cách này, các bản ghi có cùng ID khách hàng sẽ được lưu trữ gần nhau trên đĩa (được nhóm) để tăng tốc độ truy xuất của chúng.

PS Chỉ mục trên CustomerID rõ ràng sẽ không phải là duy nhất, vì vậy bạn cần thêm trường thứ hai để "duy nhất" chỉ mục hoặc để cơ sở dữ liệu xử lý việc đó cho bạn nhưng đó là một câu chuyện khác.

Về nhiều chỉ số. Bạn chỉ có thể có một chỉ mục được nhóm trên mỗi bảng vì điều này xác định cách sắp xếp dữ liệu. Nếu bạn muốn một sự tương tự, hãy tưởng tượng một căn phòng lớn có nhiều bàn trong đó. Bạn có thể đặt các bảng này để tạo thành một số hàng hoặc kéo tất cả chúng lại với nhau để tạo thành một bảng hội nghị lớn, nhưng không phải cả hai cách cùng một lúc. Một bảng có thể có các chỉ mục khác, sau đó chúng sẽ trỏ đến các mục trong chỉ mục được nhóm, cuối cùng đến lượt nó sẽ nói nơi tìm dữ liệu thực tế.


4
Điều đó được nói rằng CI nên luôn được sử dụng cho PK
mko

4
Vì vậy, với một chỉ mục được nhóm, đó là các bản ghi trong chỉ mục hoặc bảng được lưu trữ gần nhau?
Caltor

5
@Caltor Bảng. Các chỉ số được sắp xếp theo định nghĩa. Ví dụ, một btree sẽ được đặt hàng để người ta có thể chỉ cần thực hiện số học địa chỉ để tìm kiếm. Ý tưởng của cụm là để phục vụ bảng cho hiệu suất của một chỉ mục cụ thể. Để rõ ràng, các bản ghi của bảng sẽ được sắp xếp lại để phù hợp với thứ tự mà chỉ mục ban đầu .
FLGMwt

9
@Caltor Không hề! Thật vậy, tài liệu và tên của chính nó là khá sai lệch. Có một "chỉ mục cụm" thực sự có rất ít liên quan đến chỉ mục. Về mặt khái niệm, những gì bạn thực sự có là "một bảng được nhóm trên chỉ số x ".
FLGMwt

3
@ JohnOrtizOrdoñez: Chắc chắn, bạn có thể sử dụng hầu như bất kỳ mà nhân lưu trữ trong hàng, vì vậy không XML, VARCHAR(MAX)hoặc VARBINARY(MAX). Lưu ý rằng thường có ý nghĩa phân cụm trên trường ngày trước , vì một chỉ mục được nhóm có hiệu quả nhất đối với quét phạm vi, phổ biến nhất trên các loại ngày. YMMV.

317

Trong SQL Server lưu trữ theo định hướng hàng cả các chỉ mục được nhóm và không được bao gồm được tổ chức dưới dạng cây B.

nhập mô tả hình ảnh ở đây

( Nguồn hình ảnh )

Sự khác biệt chính giữa các chỉ mục được phân cụm và các chỉ mục không được phân cụm là mức độ lá của chỉ mục được phân cụm bảng. Điều này có hai hàm ý.

  1. Các hàng trên các trang lá chỉ mục được nhóm luôn chứa một cái gì đó cho mỗi cột (không thưa thớt) trong bảng (có thể là giá trị hoặc con trỏ tới giá trị thực).
  2. Chỉ mục cụm là bản sao chính của bảng.

Các chỉ mục không được nhóm cũng có thể thực hiện điểm 1 bằng cách sử dụng INCLUDEmệnh đề (Kể từ SQL Server 2005) để bao gồm rõ ràng tất cả các cột không khóa nhưng chúng là các biểu diễn phụ và luôn có một bản sao khác của dữ liệu xung quanh (chính bảng).

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

Hai chỉ số trên sẽ gần giống nhau. Với các trang chỉ mục cấp cao hơn chứa các giá trị cho các cột chính A,Bvà các trang cấp độ lá chứaA,B,C,D

Chỉ có thể có một chỉ mục được nhóm trên mỗi bảng, vì bản thân các hàng dữ liệu có thể được sắp xếp theo một thứ tự.

Trích dẫn trên từ sách SQL Server trực tuyến gây ra nhiều nhầm lẫn

Theo ý kiến ​​của tôi, nó sẽ tốt hơn nhiều.

Chỉ có thể có một chỉ mục được nhóm trên mỗi bảng, bởi vì các hàng cấp độ lá của chỉ mục được phân cụm các hàng của bảng.

Các trích dẫn trực tuyến sách không phải là không chính xác nhưng bạn nên rõ ràng rằng "sắp xếp" của cả hai chỉ số không phân cụm và phân cụm là logic không phải là vật lý. Nếu bạn đọc các trang ở cấp độ lá bằng cách theo danh sách được liên kết và đọc các hàng trên trang theo thứ tự mảng vị trí thì bạn sẽ đọc các hàng chỉ mục theo thứ tự được sắp xếp nhưng về mặt vật lý có thể không được sắp xếp. Người ta thường cho rằng với một chỉ mục được nhóm, các hàng luôn được lưu trữ vật lý trên đĩa theo cùng thứ tự với khóa chỉ mục là sai.

Đây sẽ là một thực hiện vô lý. Ví dụ: nếu một hàng được chèn vào giữa bảng 4GB thì SQL Server không phải sao chép 2GB dữ liệu trong tệp để nhường chỗ cho hàng mới được chèn.

Thay vào đó một sự phân chia trang xảy ra. Mỗi trang ở cấp độ lá của cả hai chỉ mục được phân cụm và không phân cụm có địa chỉ ( File:Page) của trang tiếp theo và trước đó theo thứ tự khóa logic. Các trang này không cần phải liền kề hoặc theo thứ tự chính.

ví dụ: chuỗi trang được liên kết có thể là 1:2000 <-> 1:157 <-> 1:7053

Khi xảy ra sự phân chia trang, một trang mới được phân bổ từ bất kỳ nơi nào trong nhóm fileg (từ một phạm vi hỗn hợp, cho các bảng nhỏ hoặc phạm vi thống nhất không trống thuộc về đối tượng đó hoặc phạm vi thống nhất mới được phân bổ). Điều này thậm chí có thể không nằm trong cùng một tệp nếu nhóm tệp chứa nhiều hơn một.

Mức độ mà trật tự logic và sự liên tục khác với phiên bản vật lý được lý tưởng hóa là mức độ phân mảnh logic.

Trong một cơ sở dữ liệu mới được tạo với một tệp duy nhất tôi đã chạy như sau.

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

Sau đó kiểm tra bố cục trang với

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

Kết quả ở khắp mọi nơi. Hàng đầu tiên theo thứ tự chính (có giá trị 1 - được tô sáng bằng mũi tên bên dưới) nằm trên gần trang vật lý cuối cùng.

nhập mô tả hình ảnh ở đây

Sự phân mảnh có thể được giảm hoặc loại bỏ bằng cách xây dựng lại hoặc sắp xếp lại một chỉ mục để tăng mối tương quan giữa trật tự logic và trật tự vật lý.

Sau khi chạy

ALTER INDEX ix ON T REBUILD;

Tôi đã nhận được sau đây

nhập mô tả hình ảnh ở đây

Nếu bảng không có chỉ mục cụm thì nó được gọi là heap.

Các chỉ mục không được nhóm có thể được xây dựng trên một heap hoặc một chỉ mục được nhóm. Chúng luôn chứa một bộ định vị hàng trở lại bảng cơ sở. Trong trường hợp của một đống, đây là một định danh hàng vật lý (thoát) và bao gồm ba thành phần (Tệp: Trang: Khe cắm). Trong trường hợp chỉ mục Clustered, bộ định vị hàng là logic (khóa chỉ mục được nhóm).

Đối với trường hợp sau, nếu chỉ mục không được nhóm đã tự nhiên bao gồm (các) cột khóa CI hoặc là cột khóa NCI hoặc INCLUDEcột -d thì không có gì được thêm vào. Mặt khác, (các) cột khóa CI bị thiếu âm thầm được thêm vào NCI.

SQL Server luôn đảm bảo rằng các cột chính là duy nhất cho cả hai loại chỉ mục. Tuy nhiên, cơ chế này được thi hành cho các chỉ mục không được khai báo là khác nhau duy nhất giữa hai loại chỉ mục.

Các chỉ mục được nhóm được uniquifierthêm vào cho bất kỳ hàng nào có giá trị chính trùng lặp với một hàng hiện có. Đây chỉ là một số nguyên tăng dần.

Đối với các chỉ mục không được phân cụm không được khai báo là SQL Server duy nhất âm thầm thêm trình định vị hàng vào khóa chỉ mục không được phân cụm. Điều này áp dụng cho tất cả các hàng, không chỉ những hàng thực sự trùng lặp.

Danh pháp phân cụm so với không phân cụm cũng được sử dụng cho các chỉ mục lưu trữ cột. Các cải tiến giấy cho các trạng thái lưu trữ cột của máy chủ SQL

Mặc dù dữ liệu lưu trữ cột không thực sự được "phân cụm" trên bất kỳ khóa nào, chúng tôi đã quyết định giữ lại quy ước SQL Server truyền thống về việc chỉ mục chính là một chỉ mục được nhóm.


8
@brainstorm vâng tôi biết điều đó. Có lẽ đó là do cụm từ trên trang MSDN này nhưng để thấy rằng cụm từ đó có phần gây hiểu lầm, bạn chỉ cần nhìn vào các chủ đề phân mảnh
Martin Smith

12
@brainstorm: Thật đáng ngạc nhiên khi một số tuyên bố sai được lặp lại như là tin lành. Một cụm chỉ ra rằng, ít nhất là từ góc độ của các lần đọc tuần tự, sẽ là "mong muốn" để các hàng được lưu trữ trên đĩa theo thứ tự như chỉ mục , nhưng điều đó khác xa khi nói rằng nó sẽ khiến chúng thực sự được lưu trữ trong một thời trang như vậy.
supercat

5
@MartinSmith Tôi đã sao chép và xác nhận kết quả kiểm tra của bạn trên SQL Server 2014. Tôi nhận được 95%sự phân mảnh của chỉ mục sau khi chèn ban đầu. Sau khi index rebuildphân mảnh 0%và các giá trị được đặt hàng. Tôi đang tự hỏi, chúng ta có thể nói điều đó The only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0?
gotqn

8
@MartinSmith Bây giờ, thưa ông, đây là một câu trả lời. Tôi rất muốn thấy nó ở đầu danh sách phản hồi nhưng khi SO đi, "nhanh chóng và đơn giản" sẽ được nâng cấp.
vaitrafra

5
@Manachi câu trả lời này đã được đưa ra 5 năm sau khi câu hỏi ban đầu được hỏi. Mục đích của nó là để sửa một số khía cạnh sai lệch của những câu trả lời. Những ý tưởng bất chợt (hiện đã 8 tuổi) của OP không phải là mối quan tâm của tôi. Những độc giả khác có thể đánh giá cao một quan điểm cấp thấp hơn.
Martin Smith

150

Tôi nhận ra đây là một câu hỏi rất cũ, nhưng tôi nghĩ rằng tôi sẽ đưa ra một sự tương tự để giúp minh họa các câu trả lời tốt ở trên.

CHỈ SỐ XÁC NHẬN

Nếu bạn bước vào một thư viện công cộng, bạn sẽ thấy rằng tất cả các cuốn sách được sắp xếp theo một thứ tự cụ thể (rất có thể là Hệ thống thập phân Dewey, hoặc DDS). Điều này tương ứng với "chỉ mục cụm" của các cuốn sách. Nếu DDS # cho cuốn sách bạn muốn là 005.7565 F736s, bạn sẽ bắt đầu bằng cách định vị hàng giá sách được dán nhãn 001-099hoặc một cái gì đó tương tự. (Dấu endcap này ở cuối ngăn xếp tương ứng với "nút trung gian" trong chỉ mục.) Cuối cùng, bạn sẽ đi sâu vào giá cụ thể được gắn nhãn 005.7450 - 005.7600, sau đó bạn sẽ quét cho đến khi bạn tìm thấy sách có DDS # được chỉ định và tại điểm đó bạn đã tìm thấy cuốn sách của bạn.

CHỈ SỐ KHÔNG ĐƯỢC YÊU CẦU

Nhưng nếu bạn không vào thư viện với DDS # trong cuốn sách của bạn được ghi nhớ, thì bạn sẽ cần một chỉ mục thứ hai để hỗ trợ bạn. Vào thời xa xưa, bạn sẽ tìm thấy ở phía trước của thư viện một văn phòng ngăn kéo tuyệt vời được gọi là "Danh mục thẻ". Trong đó có hàng ngàn thẻ 3x5 - mỗi thẻ được sắp xếp theo thứ tự bảng chữ cái (theo tiêu đề, có lẽ). Điều này tương ứng với "chỉ mục không phân cụm" . Các danh mục thẻ này được tổ chức theo cấu trúc phân cấp, sao cho mỗi ngăn kéo sẽ được gắn nhãn với phạm vi thẻ chứa trong đó ( Ka - Klví dụ: "nút trung gian"). Một lần nữa, bạn sẽ khoan cho đến khi bạn tìm thấy cuốn sách của bạn, nhưng trong này trường hợp, một khi bạn đã tìm thấy nó (tức là, "lá nút"), bạn không có cuốn sách riêng của mình,số chỉ mục (DDS #) mà bạn có thể tìm thấy sách thực tế trong chỉ mục được nhóm.

Tất nhiên, không có gì có thể ngăn người thủ thư sao chép tất cả các thẻ và sắp xếp chúng theo một thứ tự khác trong một danh mục thẻ riêng biệt. (Thông thường có ít nhất hai danh mục như vậy: một danh mục được sắp xếp theo tên tác giả và một theo tiêu đề.) Về nguyên tắc, bạn có thể có nhiều chỉ mục "không phân cụm" như bạn muốn.


2
Có lẽ, tôi có thể mở rộng sự tương tự này để mô tả các cột "Đã bao gồm" , có thể được sử dụng với Chỉ mục không phân cụm: Người ta có thể tưởng tượng một thẻ trong danh mục thẻ bao gồm nhiều hơn một cuốn sách, nhưng thay vào đó là danh sách tất cả các cuốn sách được xuất bản các phiên bản của cuốn sách, được tổ chức số lượng theo ngày xuất bản. Giống như trong "cột được bao gồm", thông tin này chỉ được lưu trữ ở cấp độ lá (do đó giảm số lượng thẻ mà thủ thư phải tạo).
kmote

1
sự tương tự tuyệt vời - thực sự giúp hình dung nó!
Denis

71

Tìm bên dưới một số đặc điểm của các chỉ mục được phân cụm và không phân cụm:

Chỉ mục cụm

  1. Các chỉ mục được nhóm là các chỉ mục xác định duy nhất các hàng trong bảng SQL.
  2. Mỗi bảng có thể có chính xác một chỉ mục cụm.
  3. Bạn có thể tạo một chỉ mục được nhóm bao gồm nhiều hơn một cột. Ví dụ : create Index index_name(col1, col2, col.....).
  4. Theo mặc định, một cột có khóa chính đã có một chỉ mục được nhóm.

Chỉ mục không phân cụm

  1. Các chỉ mục không phân cụm giống như các chỉ mục đơn giản. Chúng chỉ được sử dụng để lấy dữ liệu nhanh chóng. Không chắc chắn có dữ liệu duy nhất.

34
Một điều chỉnh nhỏ cho Điểm 1. Một chỉ mục được nhóm không nhất thiết phải xác định duy nhất các hàng trong bảng SQL. Đó là chức năng của một KHÓA CHÍNH
Nigel

4
@Nigel, KHÓA CHÍNH hoặc CHỈ ĐỘC ĐÁO?
anar khalilov

câu trả lời thực tế và trực tiếp, cảm ơn @Anirudh Sood
Oscar Romero

50

Một quy tắc rất đơn giản, phi kỹ thuật sẽ là các chỉ mục được phân cụm thường được sử dụng cho khóa chính của bạn (hoặc, ít nhất là một cột duy nhất) và không được phân cụm được sử dụng cho các tình huống khác (có thể là khóa ngoại) . Thật vậy, SQL Server theo mặc định sẽ tạo một chỉ mục được nhóm trên (các) cột khóa chính của bạn. Như bạn đã biết, chỉ mục được nhóm liên quan đến cách sắp xếp dữ liệu trên đĩa, điều đó có nghĩa là nó là lựa chọn toàn diện cho hầu hết các tình huống.


47

Chỉ số cụm

Một chỉ mục được nhóm xác định thứ tự vật lý của DATA trong một bảng. Vì lý do này, một bảng chỉ có 1 chỉ mục được nhóm.

  • " dictionary " Không cần bất kỳ Index nào khác, Index đã theo Index

Chỉ số không bao gồm

Một chỉ mục không được nhóm tương tự như một chỉ mục trong Book. Dữ liệu được lưu trữ ở một nơi. Chỉ mục đang lưu trữ ở một nơi khác và chỉ mục có con trỏ đến vị trí lưu trữ dữ liệu. Vì lý do này, một bảng có nhiều hơn 1 Chỉ mục không tách rời.

  • " Sách hóa học " khi nhìn chằm chằm có một chỉ mục riêng để chỉ vị trí Chương và Tại "KẾT THÚC" có một Chỉ mục khác chỉ vị trí WORDS chung

6

Chỉ số cụm

Các chỉ mục được nhóm sắp xếp và lưu trữ các hàng dữ liệu trong bảng hoặc dạng xem dựa trên các giá trị chính của chúng. Đây là các cột được bao gồm trong định nghĩa chỉ mục. Chỉ có thể có một chỉ mục được nhóm trên mỗi bảng, vì bản thân các hàng dữ liệu có thể được sắp xếp theo một thứ tự.

Lần duy nhất các hàng dữ liệu trong một bảng được lưu theo thứ tự được sắp xếp là khi bảng chứa chỉ mục được nhóm. Khi một bảng có một chỉ mục được nhóm, bảng được gọi là bảng cụm. Nếu một bảng không có chỉ mục được nhóm, các hàng dữ liệu của nó được lưu trữ trong một cấu trúc không có thứ tự gọi là heap.

Không bao gồm

Các chỉ mục không bao gồm có cấu trúc tách biệt với các hàng dữ liệu. Một chỉ mục không bao gồm chứa các giá trị khóa chỉ mục không được bao gồm và mỗi mục nhập giá trị khóa có một con trỏ tới hàng dữ liệu chứa giá trị khóa. Con trỏ từ một hàng chỉ mục trong một chỉ mục không bao gồm đến một hàng dữ liệu được gọi là một bộ định vị hàng. Cấu trúc của bộ định vị hàng phụ thuộc vào việc các trang dữ liệu được lưu trữ trong một đống hay một bảng cụm. Đối với một đống, một bộ định vị hàng là một con trỏ đến hàng. Đối với bảng được phân cụm, bộ định vị hàng là khóa chỉ mục được nhóm.

Bạn có thể thêm các cột không khóa vào cấp độ lá của chỉ mục không bao gồm để vượt qua các giới hạn khóa chỉ mục hiện có và thực hiện các truy vấn được bao phủ, lập chỉ mục đầy đủ. Để biết thêm thông tin, hãy xem Tạo chỉ mục với các cột được bao gồm. Để biết chi tiết về giới hạn khóa chỉ mục, xem Thông số công suất tối đa cho SQL Server.

Tham khảo: https://docs.microsoft.com/en-us/sql/relational-database/indexes/clustered-and-nonclustered-indexes-descrip


4

Hãy để tôi cung cấp một định nghĩa sách giáo khoa về "chỉ mục phân cụm", được lấy từ 15.6.1 từ Hệ thống cơ sở dữ liệu: Toàn bộ cuốn sách :

Chúng ta cũng có thể nói về các chỉ mục phân cụm , là các chỉ mục trên một thuộc tính hoặc thuộc tính sao cho tất cả các bộ dữ liệu có giá trị cố định cho khóa tìm kiếm của chỉ mục này xuất hiện trên một số khối có thể giữ chúng.

Để hiểu định nghĩa, chúng ta hãy xem ví dụ 15.10 được cung cấp bởi sách giáo khoa:

Một mối quan hệ R(a,b)được sắp xếp trên thuộc tính avà được lưu trữ theo thứ tự đó, được đóng gói thành các khối, chắc chắn là cụm. Một chỉ mục trên alà một chỉ mục phân cụm, vì với giá atrị a1 đã cho, tất cả các bộ dữ liệu có giá trị đó alà liên tiếp. Do đó, chúng xuất hiện được đóng gói thành các khối, có thể được thực thi cho các khối đầu tiên và cuối cùng có chứa a-value a1, như được đề xuất trong Hình.15.14. Tuy nhiên, một chỉ mục trên b không có khả năng được phân cụm, vì các bộ dữ liệu có giá btrị cố định sẽ được trải đều trên toàn bộ tệp trừ khi các giá trị của abcó mối tương quan rất chặt chẽ.

Hình 15,14

Lưu ý rằng định nghĩa không bắt buộc các khối dữ liệu phải được đặt liền kề trên đĩa; nó chỉ nói các bộ dữ liệu với khóa tìm kiếm được đóng gói thành càng ít khối dữ liệu càng tốt.

Một khái niệm liên quan là quan hệ cụm . Một mối quan hệ được "phân cụm" nếu các bộ dữ liệu của nó được đóng gói thành khoảng vài khối có thể chứa các bộ dữ liệu đó. Nói cách khác, từ góc độ khối đĩa, nếu nó chứa các bộ dữ liệu từ các mối quan hệ khác nhau, thì các mối quan hệ đó không thể được nhóm lại (nghĩa là, có một cách đóng gói hơn để lưu trữ mối quan hệ đó bằng cách hoán đổi các bộ dữ liệu của mối quan hệ đó từ các khối đĩa khác với bộ dữ liệu không thuộc về mối quan hệ trong khối đĩa hiện tại). Rõ ràng, R(a,b)trong ví dụ trên là cụm.

Để kết nối hai khái niệm với nhau, một mối quan hệ phân cụm có thể có một chỉ mục phân cụm và chỉ mục không bao gồm. Tuy nhiên, đối với mối quan hệ không phân cụm, chỉ mục phân cụm là không thể trừ khi chỉ mục được xây dựng trên đỉnh của khóa chính của mối quan hệ.

"Cụm" như một từ bị spam trong tất cả các mức trừu tượng của phía lưu trữ cơ sở dữ liệu (ba cấp độ trừu tượng: tuples, khối, tệp). Một khái niệm gọi là " tập tin cụm ", mô tả liệu một tập tin (một sự trừu tượng hóa cho một nhóm các khối (một hoặc nhiều khối đĩa)) có chứa các bộ dữ liệu từ một mối quan hệ hoặc các mối quan hệ khác nhau. Nó không liên quan đến khái niệm chỉ mục phân cụm vì nó ở cấp độ tệp.

Tuy nhiên, một số tài liệu giảng dạy thích xác định chỉ mục phân cụm dựa trên định nghĩa tệp phân cụm. Hai loại định nghĩa này giống nhau ở mức độ quan hệ cụm, bất kể chúng xác định quan hệ cụm theo thuật ngữ của khối dữ liệu hoặc tệp. Từ liên kết trong đoạn này,

Một chỉ mục trên (các) thuộc tính A trên một tệp là một chỉ mục phân cụm khi: Tất cả các bộ dữ liệu có giá trị thuộc tính A = a được lưu trữ tuần tự (= liên tiếp) trong tệp dữ liệu

Lưu trữ các bộ dữ liệu liên tiếp cũng giống như nói "các bộ dữ liệu được đóng gói thành một số khối nhỏ nhất có thể có thể chứa các bộ dữ liệu đó" (với sự khác biệt nhỏ trên một người nói về tệp, người khác nói về đĩa). Đó là bởi vì lưu trữ bộ dữ liệu liên tiếp là cách để đạt được "đóng gói thành khoảng vài khối nhất có thể có thể giữ những bộ dữ liệu đó".


3

Chỉ mục cụm : Ràng buộc khóa chính tự động tạo Chỉ mục cụm nếu không có Chỉ mục cụm nào tồn tại trên bảng. Dữ liệu thực tế của chỉ mục được nhóm có thể được lưu trữ ở cấp độ lá của Index.

Chỉ mục không phân cụm : Dữ liệu thực tế của chỉ mục không phân cụm không được tìm thấy trực tiếp tại nút lá, thay vào đó, nó phải thực hiện một bước bổ sung để tìm bởi vì nó chỉ có các giá trị của bộ định vị hàng hướng vào dữ liệu thực tế. Chỉ mục không phân cụm không thể được sắp xếp thành chỉ mục cụm. Có thể có nhiều chỉ mục không được nhóm trên mỗi bảng, thực tế nó phụ thuộc vào phiên bản máy chủ sql chúng tôi đang sử dụng. Về cơ bản, máy chủ Sql 2005 cho phép 249 Chỉ mục không phân cụm và đối với các phiên bản trên như 2008, 2016, nó cho phép 999 Chỉ mục không phân cụm trên mỗi bảng.


2

Chỉ mục cụm - Một chỉ mục được xác định theo thứ tự dữ liệu được lưu trữ vật lý trong một bảng. Dữ liệu bảng có thể được sắp xếp theo cách duy nhất, do đó, chỉ có thể có một chỉ mục được nhóm trên mỗi bảng. Trong SQL Server, ràng buộc khóa chính sẽ tự động tạo một chỉ mục được nhóm trên cột cụ thể đó.

Chỉ số không phân cụm- Một chỉ mục không được nhóm không sắp xếp dữ liệu vật lý trong bảng. Trong thực tế, một chỉ mục không được nhóm được lưu trữ ở một nơi và dữ liệu bảng được lưu trữ ở một nơi khác. Điều này tương tự như một cuốn sách giáo khoa nơi nội dung cuốn sách được đặt ở một nơi và chỉ mục được đặt ở một nơi khác. Điều này cho phép nhiều hơn một chỉ mục không được nhóm trên mỗi bảng. Điều quan trọng cần đề cập ở đây là bên trong bảng, dữ liệu sẽ được sắp xếp theo một chỉ mục được nhóm. Tuy nhiên, bên trong dữ liệu chỉ mục không được nhóm được lưu trữ theo thứ tự được chỉ định. Chỉ mục chứa các giá trị cột mà chỉ mục được tạo và địa chỉ của bản ghi mà giá trị cột thuộc về. Khi truy vấn được đưa ra đối với cột được tạo chỉ mục, trước tiên cơ sở dữ liệu sẽ đi đến chỉ mục và tìm kiếm địa chỉ của hàng tương ứng trong bảng. Sau đó, nó sẽ đi đến địa chỉ hàng đó và tìm nạp các giá trị cột khác. Đó là do bước bổ sung này mà các chỉ mục không được phân cụm chậm hơn các chỉ mục được phân cụm

Sự khác nhau giữa chỉ số phân cụm và không phân cụm

  1. Chỉ có thể có một chỉ mục được nhóm trên mỗi bảng. Tuy nhiên, bạn có thể tạo nhiều chỉ mục không được nhóm trên một bảng.
  2. Chỉ mục cụm chỉ sắp xếp bảng. Do đó, họ không tiêu thụ thêm dung lượng. Các chỉ mục không được nhóm được lưu trữ ở một nơi riêng biệt với bảng thực tế đòi hỏi nhiều không gian lưu trữ hơn.
  3. Các chỉ mục được nhóm nhanh hơn các chỉ mục không được phân cụm vì chúng không liên quan đến bất kỳ bước tra cứu bổ sung nào.

Để biết thêm thông tin tham khảo này bài viết.

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.