Sự khác biệt giữa các chỉ mục được nhóm và không được nhóm trong Microsoft SQL Server là gì?

Một chỉ mục giúp SQL Server truy xuất dữ liệu từ các hàng một cách nhanh chóng. Các chỉ mục hoạt động giống như mục lục ở đầu sách, cho phép bạn tra cứu trang có chủ đề nhanh chóng. Không có chỉ mục, SQL Server phải quét tất cả các hàng trong bảng để tìm bản ghi.
Có hai loại chỉ mục trong SQL Server: được phân cụm và không được phân cụm. Tìm hiểu sự khác biệt giữa các chỉ mục được nhóm và không được nhóm và tại sao chúng lại quan trọng.
Mục Lục
Chỉ mục cụm trong SQL Server
Trong một chỉ mục được nhóm, các hàng dữ liệu được lưu trữ vật lý theo cách được sắp xếp dựa trên giá trị khóa. Vì chỉ mục bao gồm bảng và nó chỉ có thể sắp xếp các hàng theo một thứ tự nên bạn chỉ có thể tạo một chỉ mục nhóm cho mỗi bảng.
Mặc dù các chỉ mục giúp truy xuất các hàng trong một phạm vi nhanh hơn, nhưng các câu lệnh INSERT và UPDATE có thể chậm do trình tối ưu hóa truy vấn quét chỉ mục theo thứ tự cho đến khi tìm thấy chỉ mục đích.
Chỉ mục không phân cụm trong SQL Server
Chỉ mục không phân cụm chứa các giá trị khóa có mục nhập là một con trỏ được gọi là bộ định vị hàng. Đối với các bảng được nhóm (bảng có chỉ mục được nhóm), con trỏ trỏ đến một khóa trong chỉ mục được nhóm, từ đó trỏ đến hàng trong bảng. Đối với các hàng không có chỉ mục cụm, con trỏ trỏ trực tiếp đến hàng của bảng.
Cách tạo một chỉ mục cụm trong SQL Server
Khi bạn tạo một bảng có khóa chính, SQL Server sẽ tự động tạo khóa chỉ mục nhóm dựa trên khóa chính đó. Nếu không có khóa chính, bạn có thể thực thi câu lệnh sau để tạo khóa chỉ mục nhóm.
CREATE CLUSTERED INDEX <index name>
ON TABLE <table_name>(column_name)
Trong câu lệnh này, bạn đang chỉ định tên của chỉ mục, tên của bảng để tạo chỉ mục và tên cột sẽ sử dụng trong chỉ mục.
Nếu bạn thêm một khóa chính vào một bảng đã có chỉ mục được nhóm, SQL Server sẽ tạo một chỉ mục không được nhóm với nó.
Để tạo một chỉ mục nhóm không bao gồm cột khóa chính, trước tiên bạn phải loại bỏ ràng buộc khóa chính.
USE database_name
ALTER TABLE table_name
DROP CONSTRAINT pk_name
GO
Loại bỏ các ràng buộc khóa chính cũng loại bỏ chỉ mục nhóm cho phép bạn tạo một chỉ mục tùy chỉnh.
Cách tạo một Non-Clustered Index trong SQL Server
Để tạo một chỉ mục không được phân cụm, hãy sử dụng câu lệnh sau.
CREATE INDEX <index name>
ON TABLE <table_name>(column_name)
Bạn cũng có thể sử dụng từ khóa NONCLUSTERED như sau:
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name)
Câu lệnh này tạo một chỉ mục không nhóm trong bảng bạn chỉ định và bao gồm cột bạn chỉ định.
Nếu muốn, bạn có thể sắp xếp các cột theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC).
CREATE [NONCLUSTERED] INDEX <index name>
ON TABLE <table_name>(column_name ASC/DESC)
Bạn nên chọn chỉ số nào?
Cả chỉ mục nhóm và không nhóm đều cải thiện thời gian truy vấn. Nếu hầu hết các truy vấn của bạn là thao tác CHỌN trên một số cột trong bảng, thì các chỉ mục nhóm sẽ nhanh hơn. Tuy nhiên, đối với các hoạt động CHÈN hoặc CẬP NHẬT, các chỉ mục không được nhóm sẽ nhanh hơn vì trình tối ưu hóa truy vấn có thể định vị cột trực tiếp từ chỉ mục.
Như bạn có thể thấy, các chỉ mục này hoạt động tốt nhất cho các truy vấn SQL khác nhau. Do đó, hầu hết các cơ sở dữ liệu SQL sẽ được hưởng lợi từ việc có ít nhất một chỉ mục được nhóm và chỉ mục không được nhóm cho các cột được cập nhật thường xuyên.
Tầm quan trọng của các chỉ mục trong SQL Server
Các chỉ mục được nhóm và không được nhóm dẫn đến hiệu suất truy vấn cao hơn. Khi bạn chạy một truy vấn, trình tối ưu hóa truy vấn sẽ quét chỉ mục để tìm vị trí lưu trữ của một hàng rồi truy xuất thông tin từ vị trí đó. Điều này nhanh hơn nhiều so với quét tất cả các hàng trong bảng.
Bạn cũng có thể sử dụng các chỉ mục không được nhóm để giải quyết bế tắc tra cứu dấu trang bằng cách tạo một chỉ mục không được nhóm cho các cột mà các truy vấn liên quan đến truy cập.