6 tips đơn giản làm tăng hiệu suất cho câu lệnh SELECT trong SQL

Post Reply
User avatar
stararound
Posts: 22
Joined: Wed Apr 17, 2019 1:29 pm

6 tips đơn giản làm tăng hiệu suất cho câu lệnh SELECT trong SQL

Post by stararound »

Điều chỉnh hiệu suất câu lệnh SELECT có thể là một nhiệm vụ tốn thời gian mà theo nguyên tắc Pareto (nguyên tắc 80/20). 20% nỗ lực có khả năng giúp bạn cải thiện hiệu suất 80%. Để có được cải thiện hiệu suất 20% khác, có lẽ bạn cần dành 80% thời gian.

Bạn có thể áp dụng các bước kiểm tra cho câu SQL của bạn như sau:

Kiểm tra chỉ số (indexs)

Cần có các chỉ mục trên tất cả các trường được sử dụng trong các phần WHERE và JOIN của câu lệnh SQL.

Giới hạn kích thước của tập dữ liệu bạn bạn cần làm việc trên đó

Kiểm tra các bảng được sử dụng trong câu lệnh SELECT để xem bạn có thể áp dụng các bộ lọc trong mệnh đề WHERE của câu lệnh không. Một ví dụ kinh điển là khi một truy vấn ban đầu hoạt động tốt khi chỉ có vài nghìn hàng trong bảng. Khi ứng dụng phát triển, truy vấn chậm lại. Giải pháp có thể đơn giản như hạn chế truy vấn để xem dữ liệu tháng hiện tại. Khi bạn có các truy vấn có các truy vấn con (sub-query), hãy tìm cách áp dụng lọc cho câu lệnh bên trong của các truy vấn con này trái ngược với các câu lệnh bên ngoài.

Chỉ SELECT các fields bạn cần

Các trường bổ sung thường làm tăng số lượng dữ liệu được trả về và do đó dẫn đến có nhiều dữ liệu (chi tiết) hơn được trả về máy khách. Ngoài ra:
• Khi sử dụng các ứng dụng báo cáo và phân tích, đôi khi hiệu suất báo cáo chậm là do công cụ báo cáo phải thực hiện tổng hợp khi dữ liệu được nhận ở dạng chi tiết.
• Đôi khi, truy vấn có thể chạy đủ nhanh nhưng vấn đề của bạn có thể là sự cố liên quan đến mạng vì một lượng lớn dữ liệu chi tiết được gửi đến máy chủ trên mạng.
• Khi sử dụng DBMS hướng cột (column-oriented DBMS), chỉ các cột bạn đã chọn sẽ được đọc từ đĩa, càng ít cột bạn đưa vào truy vấn của bạn thì càng ít chi phí truy vấn IO.

Xóa các bảng không cần thiết

Các lý do để loại bỏ các bảng không cần thiết cũng giống như các lý do để loại bỏ các trường không cần thiết trong câu lệnh chọn.

Viết các câu lệnh SQL là một quá trình thường mất một số lần lặp đi lặp lại khi bạn viết và kiểm tra các câu lệnh SQL của mình. Trong quá trình đó, có thể bạn thêm các bảng vào truy vấn có thể không có bất kỳ tác động nào đến dữ liệu được trả về (nghĩa là dữ liệu vô nghĩa). Khi SQL chính xác, nhiều người không xem lại tập lệnh của họ và xóa các bảng không có ý nghĩa sử dụng nào trong tập dữ liệu được trả về. Bằng cách loại bỏ JOIN vào các bảng không cần thiết này, bạn sẽ giảm được lượng xử lý cơ sở dữ liệu phải làm. Giống như loại bỏ các cột bạn có thể thấy việc giảm dữ liệu trả về làm giảm hẳn xử lý cho cơ sở dữ liệu.

Xóa các OUTER JOIN

Điều này có thể nói dễ hơn làm và phụ thuộc vào mức độ ảnh hưởng của bạn trong việc thay đổi nội dung bảng. Một giải pháp là loại bỏ OUTER JOINs bằng cách đặt các hàng giữ chỗ trong cả hai bảng. Giả sử bạn có các bảng sau với OUTER JOIN được dùng để đảm bảo tất cả dữ liệu được trả về:

Customers table :

Code: Select all

+----------+------------------+
|CustomerId| CustomerName     |
+----------+------------------+
|1         | John Doe         |
|2         | Mary Jane        |
|3         | Peter Pan        |
|4         | Joe Soap         |
+----------+------------------+
Sales table :

Code: Select all

+----------+------------------+
|CustomerId| SalesPerson      |
+----------+------------------+
|NULL      | Newbee Smith     |
|2         | Oldie Jones      |
|1         | Another Oldie    |
|NULL      | Greenhorn        |
+----------+------------------+
Giải pháp là thêm một placeholder row trong bảng customer và cập nhật tất cả các giá trị NULL trong bảng sales vào khóa giữ chỗ (placeholder key).

Customers table :

Code: Select all

+----------+------------------+
|CustomerId| CustomerName     |
+----------+------------------+
|0         | NO CUSTOMER      |
|1         | John Doe         |
|2         | Mary Jane        |
|3         | Peter Pan        |
|4         | Joe Soap         |
+----------+------------------+
Sales table :

Code: Select all

+----------+------------------+
|CustomerId| SalesPerson      |
+----------+------------------+
|0         | Newbee Smith     |
|2         | Oldie Jones      |
|1         | Another Oldie    |
|0         | Greenhorn        |
+----------+------------------+
Bạn không chỉ loại bỏ nhu cầu cho OUTER JOIN mà bạn còn chuẩn hóa cách thức những người bán hàng không có khách hàng được đại diện. Các lập trình viên khác sẽ không phải viết các lệnh như ISNULL (customer_id, “chưa có khách hàng nào”).

Xóa các trường được tính toán trong mệnh đề JOIN và WHERE

Đây là một trong những điều mà đôi khi có thể nói dễ hơn làm tùy thuộc vào quyền của bạn để thực hiện thay đổi cho schema. Điều này có thể được thực hiện bằng cách tạo một trường với các giá trị được tính toán được sử dụng trong phép nối trên bảng. Ví dụ câu lệnh SQL sau:

Code: Select all

SELECT * 
FROM sales a 
JOIN budget b ON ((year(a.sale_date)* 100) + month(a.sale_date)) = b.budget_year_month
Hiệu suất có thể được cải thiện bằng cách thêm một cột với năm và tháng trong bảng doanh số. Câu lệnh SQL được cập nhật sẽ như sau:

Code: Select all

SELECT * 
FROM sales a 
JOIN budget b ON    a.sale_year_month = b.budget_year_month
Phần kết luận

Chốt lại các gợi ý bên trên tóm gọn như sau:
1. kiểm tra chỉ số
2. làm việc với tập dữ liệu nhỏ nhất cần thiết
3. loại bỏ các trường và bảng không cần thiết
4. xóa các tính toán trong mệnh đề JOIN và WHERE của bạn.

Post Reply