TopDev

Index là gì? Các loại index trong SQL Server? Và những điều bạn nên biết

minhdev 📖 5 phút đọc

Trong SQL Server, Index là một cấu trúc dữ liệu đặc biệt được tạo ra nhằm tăng tốc độ truy xuất dữ liệu trong bảng. Khi bạn truy vấn dữ liệu, nếu không có index, SQL Server phải quét toàn bộ bảng (table scan) để tìm dữ liệu phù hợp, điều này rất tốn thời gian và tài nguyên. Index giúp giảm đáng kể thời gian tìm kiếm bằng cách tổ chức lại dữ liệu hoặc con trỏ đến dữ liệu.

Có hai loại index chính trong SQL Server:

  • Clustered Index (Index cụm): Định nghĩa lại cách lưu trữ dữ liệu vật lý trên đĩa. Mỗi bảng chỉ có thể có một clustered index vì dữ liệu chỉ được sắp xếp theo một cách duy nhất. Clustered Index giống như một cuốn sách được sắp xếp theo thứ tự, giúp tìm dữ liệu rất nhanh.

  • Non-Clustered Index (Index không cụm): Là một cấu trúc riêng biệt chứa các giá trị khóa và con trỏ đến dữ liệu thực tế trong bảng. Một bảng có thể có nhiều non-clustered index để phục vụ các truy vấn khác nhau.



Clustered Index và Non-Clustered Index khác nhau thế nào?

Tiêu chí Clustered Index Non-Clustered Index
Cách lưu trữ Sắp xếp dữ liệu vật lý trong bảng Lưu trữ riêng, chứa khóa và con trỏ
Số lượng cho phép Chỉ có 1 index cho mỗi bảng Có thể có nhiều index
Tốc độ truy xuất Rất nhanh cho truy vấn dựa trên khóa chính Nhanh cho các truy vấn đa dạng
Kích thước Chiếm dung lượng lớn vì dữ liệu được sắp xếp Nhỏ hơn clustered index
Ảnh hưởng khi thay đổi Thay đổi dữ liệu ảnh hưởng trực tiếp đến index Thay đổi dữ liệu cần cập nhật index riêng


Làm sao để kiểm tra và tối ưu hiệu suất truy vấn SQL Server?

Để kiểm tra hiệu suất truy vấn và tối ưu chúng trong SQL Server, bạn có thể làm theo các bước sau:

  • Sử dụng SQL Server Management Studio (SSMS) để chạy truy vấn và xem kết quả thực thi.

  • Dùng công cụ Execution Plan để phân tích cách SQL Server xử lý truy vấn. Execution Plan sẽ cho biết truy vấn đang sử dụng index nào, có xảy ra table scan hay không, và các bước tốn kém về thời gian.

  • Kiểm tra các chỉ số hiệu suất như CPU usage, Logical Reads, I/O để đánh giá truy vấn.

  • Tối ưu câu lệnh SQL bằng cách thêm index phù hợp, viết lại câu truy vấn, tránh truy vấn quá nhiều dữ liệu không cần thiết.

  • Sử dụng các chỉ số (statistics) để SQL Server có thể đưa ra kế hoạch truy vấn tối ưu nhất.

  • Cập nhật và tái tạo index định kỳ để tránh phân mảnh.



Tại sao lại xảy ra table scan thay vì index seek?

Table Scan là hiện tượng SQL Server phải đọc toàn bộ bảng để tìm dữ liệu phù hợp, trong khi Index Seek là truy vấn đi thẳng vào index để lấy dữ liệu nhanh hơn.

Nguyên nhân dẫn đến table scan thay vì index seek thường là:

  • Không có index phù hợp cho truy vấn.

  • Câu truy vấn không sử dụng các cột được đánh index.

  • Index bị phân mảnh hoặc không cập nhật thống kê (statistics).

  • Truy vấn yêu cầu lấy gần như toàn bộ bảng (ví dụ: SELECT * FROM Table không có điều kiện WHERE).

  • Kế hoạch truy vấn (execution plan) của SQL Server đánh giá index seek không hiệu quả bằng table scan do dữ liệu phân bố không đều.



Dùng EXPLAIN hoặc EXECUTION PLAN như thế nào?

Trong SQL Server, để xem cách tối ưu truy vấn và biết tại sao truy vấn lại chọn table scan hay index seek, bạn dùng Execution Plan:

  • Trong SQL Server Management Studio (SSMS), bạn có thể bật Actual Execution Plan bằng cách nhấn tổ hợp phím Ctrl + M hoặc nhấn nút “Include Actual Execution Plan” trước khi chạy truy vấn.

  • Sau khi truy vấn chạy xong, tab Execution Plan sẽ hiển thị các bước thực thi truy vấn dưới dạng biểu đồ, chỉ ra các hoạt động như Index Seek, Table Scan, Nested Loop, Hash Join...

  • Bạn đọc biểu đồ này để xác định phần nào tốn thời gian nhất, có sử dụng index không, hay có table scan nào xảy ra.

  • Từ đó, bạn có thể điều chỉnh câu truy vấn hoặc thêm/bỏ index để cải thiện hiệu suất.



Kết luận

Hiểu rõ về index trong SQL Server và cách thức hoạt động của Clustered Index và Non-Clustered Index giúp bạn tối ưu hóa hiệu suất truy vấn hiệu quả. Việc kiểm tra truy vấn qua Execution Plan và phân tích nguyên nhân gây ra table scan thay vì index seek là bước quan trọng để cải thiện tốc độ và giảm tải cho hệ thống.

Nếu bạn đang quản lý hệ thống SQL Server, hãy luôn duy trì index hợp lý, thường xuyên cập nhật thống kê và sử dụng Execution Plan để theo dõi và tối ưu truy vấn.

Bài liên quan trong #Database

✓ Đã sao chép link