SQL - Clustered Index là gì?(What is an clustered index in SQL Server?)





Bài viết hôm nay sẽ trình bày một số khái miện về Clusterned Index và cách sử dụng loại Index này.








Tổng hợp mô tả từ MSDN của Microsoft.

Clustered Index là một dạng cấu trúc dùng để lưu trữ và sắp xếp dữ liệu vật lý trong table hoặc view dựa trên các giá trị khóa của chúng.

Các cột khóa này được chỉ định trong định nghĩa index. Mỗi table hoặc view chỉ có duy nhất một Clusterd Index vì bản thân các dòng dữ liệu được lưu trữ và sắp xếp theo thứ tự vật lý dựa trên các cột trong loại Index này.

Khi dữ liệu trong table hoặc view cần được lưu trữ và sắp xếp theo một thứ tự nhất định chính là lúc cần dùng đến Clustered Index.

Khi một table có một Clusted Index thì khi đó table được gọi là Clustered Table. Nếu không, các dòng dữ liệu của table được lưu trong một cấu trúc không được sắp xếp Index gọi là HEAP.


Tổng hợp mô tả từ một số diễn đàn trên mạng.
(http://goccay.vn, http://sinhvienit.net.)

Clustered Index thường được tạo khi bạn tạo một khóa chính cho bảng(primary key).

Clustered index không đòi hỏi phải có tính duy nhất (unique) trong dữ liệu. Nhưng khi nó không duy nhất thì khóa index được gắn thêm một giá trị 4-byte ngẫu nhiên để đảm bảo các node index vẫn là duy nhất. Mục đích của việc này là để cho con trỏ trong các index khác luôn trỏ đến đến duy nhất một bản ghi, khi đó con trỏ sẽ bao gồm khóa index + chuỗi 4 byte được gắn thêm.

Việc gắn thêm như vậy làm tăng kích thước của clustered index cũng như các index khác, nên trong đa số tình huống thực tiễn bạn nên tạo clustered index là duy nhất. Thực tế, theo mặc định một clustered index duy nhất sẽ được tạo khi khai báo khóa chính.


Phân tích qua thực tế.

Lý thuyết đọc nghe khó hiểu quá các bạn nhỉ, thôi giờ qua luôn một số ví dụ thực thế cho dễ hiểu. Đầu tiên ta cần tạo một 2 bảng để thực hiện ví dụ. Bạn hãy tạo 2 bảng như bên dưới.
CREATE TABLE data
(
P_Id int IDENTITY,
Value varchar(255) NOT NULL,
)

CREATE TABLE data_index
(
P_Id int IDENTITY,
Value varchar(255) NOT NULL,
)

Tiếp theo ta sẽ tạo dữ liệu cho 2 bảng.
-- Câu lệnh này chạy hơi lâu ^^!.
DECLARE @intFlag INT
set @intFlag = 1
WHILE (@intFlag < 20000)
BEGIN
    INSERT INTO data (Value) VALUES('DEMO')
    INSERT INTO data_index(Value) VALUES('DEMO')
    PRINT @intFlag
    SET @intFlag = @intFlag + 1
END

Tiếp theo ta sẽ tạo Clustered Index cho cột P_Id của bảng data_index.
CREATE CLUSTERED INDEX Index_DataIndex ON dbo.data_index(P_Id)

Bây giờ ta sẽ kiểm tra hiệu suất giữa bảng có Clustered Index(data_index) và bảng không có Clustered Index(data) bằng 2 câu trúc bên dưới.
SELECT * FROM data WHERE P_Id = 100
SELECT * FROM data_index WHERE P_Id = 100

Ta sẽ thấy dược kết quả như hình bên dưới.


Như trong hình trên ta thấy bảng data không sử dụng dụng Clustered Index thì chi phí query chiếm tới 98%, trong khi bảng data_index có sử dụng Clustered Index chi phí để thực thi câu truy vấn chỉ mất 2%.










No comments:

Post a Comment