Làm việc với Clustered Index và Non-Clustered Index trong SQLServer

Đây là hai kỹ thuật hay giúp các bạn làm việc với sql biết cách tối ưu hiệu năng khi sử dụng truy vấn lấy dữ liệu trong cơ sở dữ liệu SQL Server.

Trong SQL Server, lập chỉ mục đóng vai trò quan trọng trong việc nâng cao hiệu quả truy xuất dữ liệu. Chỉ mục là các cấu trúc dựa trên đĩa được liên kết với các bảng hoặc chế độ xem, hỗ trợ truy xuất hàng nhanh hơn bằng cách tổ chức dữ liệu theo cách có cấu trúc. Hai loại chỉ mục chính trong SQL Server là Chỉ mục nhóm (clustered index) và Chỉ mục không nhóm (non-clustered index).

Chỉ mục (index) là một cấu trúc dựa trên đĩa được liên kết với một bảng hoặc chế độ xem giúp truy xuất hàng nhanh hơn. Các cột của bảng hoặc chế độ xem được sử dụng để tạo khóa trong chỉ mục. Các khóa này được lưu trong một cấu trúc (B-tree) cho phép SQL Server truy cập nhanh chóng và hiệu quả định vị hàng hoặc các hàng tương ứng với các giá trị khóa.

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.

Các đặc điểm về clustered index:

  • Sắp xếp dữ liệu: Với clustered index, dữ liệu trong bảng đượ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.
  • Chỉ có 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, hệ thống 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.
  • 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. Trong một bảng, các khóa duy nhất và không đổi thường là lựa chọn tốt cho clustered index, ví dụ như khóa chính của bảng.
  • 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.

Cú pháp tạo Clustered Index:

Ví dụ với bảng dữ liệu NhanVien, chúng ta quan tâm đến việc tìm kiếm theo mã nhân viên (Id) ta có thể tạo clustered index như sau:

Create table NhanVien
(
Id int identity(1,1) primary key clustered,
HoTen nvarchar(30),
GioiTinh tinyint,
NgaySinh date,
DienThoai varchar(20),
Email varchar(50),
DiaChi nvarchar(150),
MaPhong varchar(10)
);
Trong ví dụ này, Id 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 Id, việc sử dụng clustered index sẽ tối ưu hiệu suất truy vấn trong SQL Server.

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.


Các đặc điểm 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: Bạn nên dùng Non-clustered index cho các truy vấn truy xuất dữ liệu phức tạp 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 hệ thống 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.

Cú pháp tạo 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. Trong trường hợp này, chúng ta có thể tạo một non-clustered index trên cột MaPhong như sau:

CREATE NONCLUSTERED INDEX IX_MaPhong ON NhanVien(MaPhong);
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 MaPhong.

Tóm lại trong bài viết này bạn cần phải nắm được 2 vấn đề quan trọng như sau:

  • 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 trong SQL Server, việc sử dụng cả clustered index và non-clustered index một cách linh hoạt và đúng đắn sẽ giúp tối ưu hiệu suất của ứng dụng và truy vấn dữ liệu trong sql.

Bên cạnh đó nếu bạn đang muốn được đào tạo bài bản từ cơ bản đến nâng cao có thể tham gia ngay khóa học sql cùng chuyên gia giàu kinh nghiệm Stanford tại đây: http://bit.ly/2SLPYFF và nhận ưu đãi hấp dẫn của Stanford trong thời gian này. Bạn có thể gọi theo hotline: 0963 723 236 - 0866 586 366 để được gọi lại tư vấn trực tiếp nhé.

=============================
☎ STANFORD – ĐÀO TẠO VÀ PHÁT TRIỂN CÔNG NGHỆ
Hotline: 0963 723 236 - 0866 586 366
Website: https://stanford.com.vn
Facebook: http://bit.ly/2FN0TYb
Youtube: http://bit.ly/2TkKT7I

Tags: clustered index, non-clustered index, học sql cùng chuyên gia