Khi sử dụng kỹ thuật tối ưu Index, bạn sẽ gặp khái niệm Clustered Index và Non-clustered Index. Bài viết này giúp bạn hiểu về khái niệm Clustered Index và cách sử dụng trong cơ sở dữ liệu SQL Server
1. Index là gì?
Index là một kỹ thuật giúp bạn tìm kiếm dữ liệu trong Table nhanh hơn.
Khi nói về Index bạn có thể hình dung ra một số hình ảnh sau:
- Hình ảnh về MỤC LỤC của một quyển sách
- Hình ảnh về DANH BẠ ĐIỆN THOẠI
Index có 2 loại, tương ứng với 2 hình ảnh trên:
- Ví dụ về MỤC LỤC một quyển sách chính là đại diện cho NON-CLUSTERED INDEX
- Ví dụ về DANH BẠ ĐIỆN THOẠI chính là đại diện cho CLUSTERED INDEX
2. Clustered Index là gì?
Hãy hình dung về hình ảnh thiết kế danh bạ điện thoại:
- Các thông tin trong danh bạ được sắp xếp theo bảng chữ cái của phần Tên
- Khi chúng ta tra cứu theo tên, cùng dòng đó ta cũng có thể biết được Số điện thoại là bao nhiêu
Các bạn hãy tìm hiểu đặc điểm của loại Index này thông qua các Demo sau nhé
3. Demo kiểm chứng việc tạo Clustered Index sẽ khiến bảng chứa dữ liệu theo thứ tự được sắp xếp.
3.1. Bước 1: Kiểm tra cách thức chứa dữ liệu của bảng không có Clustered Index
Thực hiện tạo bảng wecommit_test_index chưa có Clustered Index
create table wecommit_test_index (id int, name varchar(20), salary int); Commands completed successfully. ## Thêm dữ liệu vào bảng, các dữ liệu này có giá trị ID không theo một thứ tự nào cả insert into wecommit_test_index values(3, 'Tran Quoc Huy', 5000); insert into wecommit_test_index values(2, 'Wecommit', 200); insert into wecommit_test_index values(1, 'Tran Dinh Huy', 3000); insert into wecommit_test_index values(4, 'Tran Duc Tuan', 4000); (1 row affected) (1 row affected) (1 row affected) (1 row affected) ## Kiểm tra dữ liệu trong bảng select * from wecommit_test_index
Dữ liệu của bảng wecommit_test_index lưu theo thứ tự các dữ liệu được Insert vào bảng (Cột ID không được sắp xếp theo chiều tăng dần hoặc giảm dần).
Chiến lược thực thi của câu lệnh lúc này là: Table Scan (quét toàn bộ bảng) để trả ra kết quả mà câu lệnh SQL yêu cầu.
Ghi chú:
- Kiểm tra chiến lược thực thi của câu lệnh là thói quen nên có khi tối ưu SQL
- Nếu bạn chưa biết về vấn đề này, bạn có thể đọc các bài viết tôi từng chia sẻ tại đây:
- Chiến lược thực thi (SQL Execution Plans) là gì:https://wecommit.com.vn/sql-execution-plan-trong-toi-uu-sql/
- Hướng dẫn đọc chiến lược thực thi trong SQL Server: https://wecommit.com.vn/sql-execution-plan-trong-sql-server/
Chi phí (Cost) của câu lệnh với chiến lược Table Scan là: 0.0032864
3.2. Bước 2: Thực hiện tạo Clustered Index trên bảng
Bây giờ ta tiến hành tạo Index trên cột ID
CREATE CLUSTERED INDEX IDX_ID ON wecommit_test_index(id);
Commands completed successfully.
Thực hiện kiểm tra lại dữ liệu bảng sau khi đã tạo Index
select * from wecommit_test_index;
Chiến lược thực thi của câu lệnh lúc này không phải quét toàn bộ bảng (TABLE SCAN) nữa, mà chuyển sang quét toàn bộ CLUSTERED INDEX.
Chi phí ước tính của câu lệnh là: 0.0032864
4. Demo kiểm thử việc tạo nhiều hơn 1 Clustered Index trên bảng
Bây giờ, chúng ta thử tạo thêm 1 INDEX dạng CLUSTERED trên cột SALARY
CREATE CLUSTERED INDEX IDX_SAL ON wecommit_test_index(salary);
Hệ thống sẽ báo lỗi như sau:
Cannot create more than one clustered index on table ‘wecommit_test_index’. Drop the existing clustered index ‘IDX_ID’ before creating another.
Hệ thống sẽ không cho phép tạo thêm CLUSTERED INDEX mới, vì dữ liệu chỉ có thể sắp xếp theo 1 tiêu chí. Hiện tại dữ liệu đã sắp xếp theo thứ tự của cột ID, bây giờ chúng ta lại muốn đồng thời sắp xếp tăng dần theo SALARY là điều không thể !
5. Kiểu Index này có thể chứa giá trị NULL không?
Clustered Index hoàn toàn có thể chứa giá trị NULL
Hãy xem Demo sau:
Chúng ta sẽ thực hiện thêm một số bản ghi có cột ID chứa giá trị NULL vào bảng
insert into wecommit_test_index values(NULL, ‘WECOMMIT 2’, 10000);
(1 row affected)
insert into wecommit_test_index values(NULL, ‘WECOMMIT 3’, 9000);
(1 row affected)
select * from wecommit_test_index;
Chúng ta thấy dữ liệu NULL được thêm thành công và được sắp xếp đầu tiên trong bảng.
6. Tại đây, có một số câu hỏi mà bạn có thể tìm hiểu sâu hơn
Vậy việc tạo Clustered Index có ảnh hưởng thế nào tới hiệu năng của một bảng?
Trường hợp nào ta nên tạo Clustered Index?
PK thì có liên quan gì đến Clustered Index hay không?
7. Nếu ban muốn biết toàn bộ các kiến thức và kinh nghiệm tối ưu để trở nên khác biệt so với các anh em DEV đồng nghiệp?
Đây là chương trình sẽ giúp bạn hoàn toàn KHÁC BIỆT so với các anh em DEV đồng nghiệp: Click vào chương trình Từ điển tối ưu 100x hiệu năng
8. Tác giả bài viết:
Trần Quốc Huy – Thông tin chi tiết của tôi bạn có thể xem thêm tại đây.
Facebook của tôi: https://www.facebook.com/tran.q.huy.71/
Youtube: Click vào đây