Clustered Index và Non-Clustered Index trong SQLServer là gì ?
Clustered Index
Trong SQL Server, một "clustered index" là một cấu trúc dữ liệu được sắp xếp theo thứ tự tăng dần hoặc giảm dần của các giá trị trên một hoặc nhiều cột trong một bảng. Cấu trúc dữ liệu này sắp xếp dữ liệu thật sự trong bảng dựa trên khóa của clustered index.
Dưới đây là một số điểm quan trọng cần biết về clustered index:
-
Sắp xếp dữ liệu: Với clustered index, dữ liệu trong bảng thực sự được tổ chức và lưu trữ dựa trên khóa của clustered index. Điều này có nghĩa là các hàng trong bảng được sắp xếp theo thứ tự của khóa.
-
Duy nhất một clustered index cho mỗi bảng: Mỗi bảng chỉ có thể có duy nhất một clustered index. Nếu bạn tạo một clustered index mới cho một bảng đã có clustered index, clustered index cũ sẽ bị ghi đè.
-
Hiệu suất truy vấn: Với các truy vấn phải truy cập dữ liệu theo thứ tự của khóa, clustered index có thể cung cấp hiệu suất tốt hơn. Bởi vì dữ liệu được lưu trữ liên tục trên đĩa, nó giảm thiểu sự phải di chuyển trên đĩa và làm giảm thời gian truy cập dữ liệu.
-
Giới hạn về cấu trúc bảng: Sự tồn tại của clustered index có thể ảnh hưởng đến cấu trúc lưu trữ dữ liệu trên đĩa. Khi dữ liệu được thêm mới hoặc cập nhật, SQL Server có thể cần phải tổ chức lại các trang dữ liệu để duy trì sắp xếp của clustered index, điều này có thể gây ra overhead khi thao tác dữ liệu.
-
Quyết định lựa chọn khóa cho clustered index: Việc lựa chọn khóa cho clustered index là một quyết định quan trọng và cần phải xem xét kỹ lưỡng. Thông thường, các khóa duy nhất và không đổi thường là lựa chọn tốt cho clustered index.
-
Tìm kiếm nhanh và phạm vi quét: Do dữ liệu được tổ chức theo thứ tự của khóa, việc tìm kiếm dựa trên giá trị của khóa có thể rất nhanh. Hơn nữa, việc quét dữ liệu theo một phạm vi của khóa cũng có thể được thực hiện hiệu quả hơn.
Ví dụ về Clustered Index
Giả sử chúng ta có một bảng Employees lưu trữ thông tin về các nhân viên, và chúng ta quan tâm đến việc tìm kiếm nhân viên dựa trên mã nhân viên (EmployeeID).
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY CLUSTERED,
FirstName NVARCHAR(50),
LastName NVARCHAR(50),
Department NVARCHAR(50),
Salary DECIMAL(10, 2)
);
Trong trường hợp này, EmployeeID là khóa chính và cũng là cột của clustered index. Khi chúng ta tìm kiếm nhân viên bằng EmployeeID, việc sử dụng clustered index sẽ cải thiện hiệu suất truy vấn.
Non-Clustered Index
Trong SQL Server, một "non-clustered index" là một cấu trúc dữ liệu bổ sung được tạo ra trên một hoặc nhiều cột trong một bảng để cải thiện hiệu suất truy vấn. Non-clustered index không sắp xếp dữ liệu thật sự trong bảng như clustered index, mà thay vào đó tạo ra một bản sao của một phần hoặc toàn bộ dữ liệu và sắp xếp nó dựa trên khóa của index.
Dưới đây là một số điểm quan trọng cần biết về non-clustered index:
-
Không sắp xếp dữ liệu: Khác với clustered index, non-clustered index không sắp xếp dữ liệu thật sự trong bảng. Thay vào đó, nó tạo ra một bản sao của dữ liệu và sắp xếp nó dựa trên khóa của index.
-
Tăng hiệu suất truy vấn: Non-clustered index cung cấp một cách thức hiệu quả để truy cập dữ liệu theo các cột không phải là khóa chính. Nó tạo ra một cấu trúc dữ liệu bổ sung cho việc tìm kiếm, giúp giảm thiểu thời gian tìm kiếm và cải thiện hiệu suất truy vấn.
-
Sử dụng cho các truy vấn phức tạp: Non-clustered index thường được sử dụng cho các truy vấn truy xuất dữ liệu theo các cột không phải là khóa chính, như tìm kiếm, sắp xếp, hay thống kê dữ liệu.
-
Tăng thời gian ghi dữ liệu: Việc thêm, cập nhật hoặc xóa dữ liệu có thể làm tăng thời gian thực thi các thao tác, do SQL Server phải cập nhật các non-clustered index khi dữ liệu thay đổi.
-
Có thể tạo nhiều non-clustered index trên một bảng: Một bảng có thể có nhiều non-clustered index, cho phép tối ưu hóa truy vấn cho nhiều loại truy cập dữ liệu khác nhau.
-
Tùy chọn bao gồm cột không lặp lại: Khi tạo non-clustered index, bạn có thể bao gồm các cột không lặp lại để giúp tối ưu hóa truy vấn, bằng cách giảm số lượng bản ghi cần phải xem xét khi thực hiện truy vấn.
Ví dụ về Non-Clustered Index
Giả sử chúng ta thường xuyên cần tìm kiếm nhân viên dựa trên phòng ban (Department). Trong trường hợp này, chúng ta có thể tạo một non-clustered index trên cột Department.
CREATE NONCLUSTERED INDEX IX_Department ON Employees(Department);
Khi chúng ta thực hiện truy vấn để tìm kiếm nhân viên dựa trên phòng ban, SQL Server sẽ sử dụng non-clustered index này để tìm ra các bản ghi nhanh chóng dựa trên giá trị của cột Department.
Tóm tắt
Clustered index thường được sử dụng cho các cột có giá trị duy nhất và thường xuyên được truy cập.
Non-clustered index thường được sử dụng cho các cột không phải là khóa chính và thường xuyên được truy cập trong các truy vấn tìm kiếm, sắp xếp hoặc thống kê dữ liệu.
Khi thiết kế cơ sở dữ liệu, việc sử dụng cả clustered index và non-clustered index một cách linh hoạt và cẩn thận sẽ giúp cải thiện hiệu suất của ứng dụng và truy vấn.
All rights reserved