ĐĂNG KÝ ĐỂ NHẬN THÔNG TIN MỚI NHẤT

Ý tưởng tối ưu câu lệnh SQL phải biết của anh em DEV backend

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

tối ưu câu lệnh SQL

-------------------------------------------------------------------------------
Việc các câu lệnh có cùng chiến lược thực thi và có cùng Cost (chi phí thực hiện của câu lệnh) chứng tỏ: hiệu năng của 3 câu là giống hệt nhau.

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

Views: 2579





    Câu hỏi bảo mật

    Trả lời

    Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *