Bài viết này tôi sẽ phân tích một “Ý tưởng tối ưu câu lệnh SQL” của nhiều bạn lập trình viên: Điều chỉnh thứ tự của các cột trong điều kiện lọc (WHERE) để tăng tốc câu truy vấn.
1. Mô tả bài toán
Giả sử chúng ta cần tối ưu một chức năng tìm kiếm của chương trình, chức năng ấy tương ứng với câu lệnh sau
select * from EMPLOYEES where first_name='NGUYEN' and salary=1277 and last_name like '%D%'
2. Một số thông tin cụ thể hơn để ra quyết định tối ưu câu lệnh SQL
Bảng EMPLOYESS hiện tại có 1.100.016 bản ghi
select count(*) from EMPLOYEES 1100016
Số bản ghi thỏa mãn điều kiện FIRST_NAME=’NGUYEN’ chiếm hơn 99.99% tổng số bản ghi trong bảng EMPLOYEES
select count(*) from EMPLOYEES where first_name='NGUYEN' 1100011
Số bản ghi thỏa mãn điều kiện SALARy = 1277 chỉ chiếm tỷ lệ cực kỳ nhỏ (chưa tới 0.01%) tổng số bản ghi của bảng EMPLOYEES
select count(*) from EMPLOYEES where SALARY=1277 98
Số bản ghi thỏa mãn điều kiện last_name like ‘%D%’ chiếm hơn 22% tổng số lượng bản ghi của bảng EMPLOYEES
select count(*) from EMPLOYEES where last_name like ‘%D%’
244450
3. Một số ý tưởng tối ưu câu truy vấn SQL mà tôi được nghe trong quá trình làm việc với các anh em DEV
Chuyển các điều kiện có tỉ lệ số bản ghi thỏa mãn nhỏ nhất đứng ở đầu tiên trong điều kiện WHERE của câu lệnh SQL.
Với ý tưởng này, chúng ta sẽ sắp xếp thứ tự ưu tiên của điều kiện như sau:
select *
from EMPLOYEES
where
salary=1277
and last_name like '%D%'
and first_name='NGUYEN'
Vậy ý tưởng này là đúng hay sai?
4. Giải đáp về ý tưởng tối ưu câu lệnh SQL trên
Về mặt bản chất, muốn đánh giá hiệu năng của câu lệnh SQL chúng ta cần dựa vào chiến lược thực thi của câu lệnh (SQL Execution Plans)
Với anh em nào chưa biết về chiến lược thực thi của câu lệnh SQL thì có thể đọc một bài viết khác của tôi tại đây: SQL Execution Plans trong tối ưu SQL
Tôi sẽ thực hiện kiểm tra chiến lược thực thi của các câu lệnh SQL sau khi đã đổi chỗ thứ tự trong mệnh đề WHERE
Tôi đánh giá 3 câu lệnh:
- Câu lệnh thứ nhất: đưa SALARY lên đầu tiên trong mệnh đề WHERE
select *
from EMPLOYEES
where
salary=1277
and last_name like '%D%'
and first_name='NGUYEN'
- Câu lệnh thứ hai: đưa FIRST_NAME lên đầu tiên trong mệnh đề WHERE
select *
from EMPLOYEES
where
first_name='NGUYEN'
and salary=1277
and last_name like '%D%'
- Câu lệnh thứ ba: đưa LAST_NAME lên đầu tiên trong mệnh đề WHERE
select *
from EMPLOYEES
where
first_name='NGUYEN'
and salary=1277
and last_name like '%D%'
Kết quả: Cả 3 câu lệnh trên đều có chung 1 chiến lược thực thi
-------------------------------------------------------------------------------
5. Một số câu hỏi để bạn đọc có thể nghiên cứu sâu hơn
- Nếu bây giờ tôi tạo thêm Index trên cột SALARY thì 3 câu lệnh bên trên có hiệu năng giống nhau hay không?
- Nếu tôi tạo thêm Index trên cột (SALARY, LAST_NAME) thì 3 câu lệnh trên có hiệu năng giống nhau hay không?
6. Nếu bạn muốn biết tất cả các kỹ thuật tối ưu câu lệnh SQL dành riêng cho DEV
Tôi thực hiện đúc kết tất cả kinh nghiệm và kỹ thuật tối ưu SQL, tối ưu database trong chương trình “Từ điển tối ưu 100x hiệu năng”.
Bạn có thể xem chi tiết chương trình tại đây: Click vào đây để tìm hiểu chương trình
Nếu bạn muốn biết về tác giả của chương trình “Từ điển tối ưu 100x hiệu năng”: Click vào đây.
7. Tham gia cộng đồng Zalo Tư Duy – Tối Ưu – Khác biệt (Miễn phí) để đọc toàn bộ các bài viết và Demo về tối ưu SQL tôi đã chia sẻ cho cộng đồng
Link nhóm Zalo: https://wecommit.com.vn/zalo