Mô tả chi tiết Introduction to Query Optimization Nguyễn Thế Hào Đinh Quang Vinh (Từng câu trong bài viết này đã được duyệt lại bởi nhóm tác giả)
Dưới đây là tóm tắt toàn diện và có cấu trúc về tài liệu tối ưu hóa truy vấn (Query Optimization):
Tổng quan về Query Optimization:
Truy vấn SQL mô tả dữ liệu cần lấy nhưng không quy định cách xử lý cụ thể.
Quá trình xử lý gồm 4 giai đoạn: Phân tích/kiểm tra cú pháp, xây dựng Logical Plan, đánh giá các phương án bằng Statistics và Cost Model, và lựa chọn Physical Plan cuối cùng.
Logical Plan tập trung vào các phép toán logic cần thực hiện, trong khi Physical Plan xác định các toán tử (operator) và phương thức thực thi chi tiết trên dữ liệu.
Các phép biến đổi trong Logical Plan:
Split Conjunctive Predicates: Tách các điều kiện lọc kết hợp bằng AND thành các predicate độc lập để optimizer dễ dàng xử lý.
Predicate Pushdown: Đưa các điều kiện lọc xuống gần nguồn dữ liệu (trước khi thực hiện phép Join) nhằm loại bỏ sớm các dòng không cần thiết.
Projection Pushdown: Loại bỏ sớm các cột không sử dụng trong các bước xử lý phía sau để giảm độ rộng dữ liệu trung gian.
Các tình huống và kỹ thuật thực hành tối ưu:
Sargable Predicate & Access Path: Viết lại điều kiện (tránh dùng hàm bọc cột như
EXTRACTtrên cột đã đánh index) để tạo điều kiện sử dụng Index Scan thay vì Sequential Scan, giúp giảm đáng kể thời gian thực thi và tài nguyên.Statistics, Selectivity & Cardinality: Cập nhật thông tin thống kê dữ liệu (lệnh
ANALYZE) giúp hệ quản trị ước lượng số dòng (Cardinality) chuẩn xác hơn, hỗ trợ optimizer đưa ra quyết định tối ưu.Composite Index: Thiết kế chỉ mục gộp phù hợp với mẫu truy vấn (kết hợp điều kiện bằng và điều kiện khoảng) để chuyển bộ lọc từ dạng
FiltersangIndex Cond.Pre-Aggregation trước Join: Tổng hợp dữ liệu (Aggregate) ở các bảng chi tiết trước khi tham gia Join giúp thu hẹp quy mô dữ liệu trung gian và giảm thiểu I/O tạm thời.
Loại bỏ thao tác thừa: Lược bỏ các toán tử không cần thiết như
DISTINCThoặcORDER BYkhi cấu trúcGROUP BYđã đảm bảo tính duy nhất và kết quả đầu ra không yêu cầu sắp xếp cố định. Lưu ý phân biệt rõ vai trò của mệnh đềWHERE(lọc trước khi gom nhóm) vàHAVING(lọc dựa trên kết quả aggregate).
Nguyên tắc cốt lõi: Mọi thay đổi và tối ưu câu lệnh SQL đều cần phải được kiểm chứng thực tế thông qua kế hoạch thực thi (Execution Plan) thay vì chỉ dựa vào suy luận lý thuyết.