Bài 16: Tối ưu Query với Views

Views là một công cụ mạnh mẽ trong SQL, cho phép bạn tạo ra các bảng ảo dựa trên kết quả của một truy vấn. Views giúp đơn giản hóa các truy vấn phức tạp, tăng tính bảo mật và tái sử dụng logic truy vấn. Tuy nhiên, nếu không được sử dụng đúng cách, views có thể gây ra các vấn đề về hiệu suất. Bài viết này sẽ đi sâu vào khái niệm views, cách sử dụng views để tối ưu hóa truy vấn, và so sánh giữa regular views và materialized views.


16.1. Views là gì?

Views là các bảng ảo được tạo ra từ kết quả của một truy vấn SQL. Chúng không lưu trữ dữ liệu thực tế mà chỉ lưu trữ định nghĩa của truy vấn. Khi truy vấn một view, hệ thống sẽ thực thi truy vấn cơ sở và trả về kết quả.

16.1.1. Cách tạo và sử dụng views
  • Cú pháp tạo view:

      CREATE VIEW view_name AS
      SELECT column1, column2, ...
      FROM table_name
      WHERE condition;
    
  • Ví dụ: Tạo một view để hiển thị thông tin nhân viên và phòng ban:

      CREATE VIEW employee_department AS
      SELECT e.employee_id, e.first_name, e.last_name, d.department_name
      FROM employees e
      JOIN departments d ON e.department_id = d.department_id;
    
  • Sử dụng view: Bạn có thể sử dụng view như một bảng thông thường trong các truy vấn SQL.

      SELECT * FROM employee_department WHERE department_name = 'Sales';
    
16.1.2. Ưu và nhược điểm của views
  • Ưu điểm:

    • Đơn giản hóa truy vấn: Views giúp đơn giản hóa các truy vấn phức tạp bằng cách đóng gói logic truy vấn.

    • Tái sử dụng: Views có thể được sử dụng lại trong nhiều truy vấn khác nhau.

    • Bảo mật: Views có thể được sử dụng để hạn chế quyền truy cập vào các cột hoặc hàng cụ thể.

  • Nhược điểm:

    • Hiệu suất: Views không lưu trữ dữ liệu thực tế, vì vậy mỗi lần truy vấn view, hệ thống phải thực thi lại truy vấn cơ sở, điều này có thể làm chậm hiệu suất.

    • Không thể cập nhật: Một số views không thể cập nhật trực tiếp (ví dụ: views chứa các phép toán phức tạp hoặc JOIN nhiều bảng).


16.2. Tối ưu query với views

Views có thể được sử dụng để tối ưu hóa các truy vấn phức tạp, nhưng cần được sử dụng một cách thông minh để tránh các vấn đề về hiệu suất.

16.2.1. Sử dụng views để đơn giản hóa query
  • Vấn đề: Các truy vấn phức tạp với nhiều JOIN, subquery, hoặc điều kiện có thể khó đọc và khó bảo trì.

  • Giải pháp: Sử dụng views để đóng gói logic truy vấn phức tạp, giúp truy vấn chính trở nên đơn giản và dễ hiểu hơn.

    • Ví dụ không tối ưu:

        SELECT e.employee_id, e.first_name, e.last_name, d.department_name
        FROM employees e
        JOIN departments d ON e.department_id = d.department_id
        WHERE d.location_id = 1;
      
    • Ví dụ tối ưu:

        CREATE VIEW employee_location AS
        SELECT e.employee_id, e.first_name, e.last_name, d.department_name
        FROM employees e
        JOIN departments d ON e.department_id = d.department_id
        WHERE d.location_id = 1;
      
        SELECT * FROM employee_location;
      
16.2.2. Tránh sử dụng views phức tạp
  • Vấn đề: Các views phức tạp (ví dụ: chứa nhiều JOIN, subquery, hoặc phép toán phức tạp) có thể làm chậm hiệu suất truy vấn.

  • Giải pháp: Tránh sử dụng các views quá phức tạp và chia nhỏ chúng thành các views đơn giản hơn.

    • Ví dụ không tối ưu:

        CREATE VIEW complex_view AS
        SELECT e.employee_id, e.first_name, e.last_name, d.department_name, p.project_name
        FROM employees e
        JOIN departments d ON e.department_id = d.department_id
        LEFT JOIN projects p ON e.employee_id = p.manager_id
        WHERE d.location_id = 1 AND p.status = 'Active';
      
    • Ví dụ tối ưu:

        CREATE VIEW employee_department AS
        SELECT e.employee_id, e.first_name, e.last_name, d.department_name
        FROM employees e
        JOIN departments d ON e.department_id = d.department_id
        WHERE d.location_id = 1;
      
        CREATE VIEW employee_project AS
        SELECT e.employee_id, p.project_name
        FROM employees e
        LEFT JOIN projects p ON e.employee_id = p.manager_id
        WHERE p.status = 'Active';
      
        SELECT ed.*, ep.project_name
        FROM employee_department ed
        LEFT JOIN employee_project ep ON ed.employee_id = ep.employee_id;
      

16.3. Materialized Views

Materialized views là một loại view đặc biệt, lưu trữ kết quả của truy vấn cơ sở dưới dạng dữ liệu thực tế. Chúng khác với regular views ở chỗ dữ liệu được lưu trữ vật lý và có thể được cập nhật định kỳ.

16.3.1. Cách sử dụng materialized views
  • Cú pháp tạo materialized view:

      CREATE MATERIALIZED VIEW mv_name AS
      SELECT column1, column2, ...
      FROM table_name
      WHERE condition;
    
  • Ví dụ: Tạo một materialized view để lưu trữ thông tin nhân viên và phòng ban:

      CREATE MATERIALIZED VIEW mv_employee_department AS
      SELECT e.employee_id, e.first_name, e.last_name, d.department_name
      FROM employees e
      JOIN departments d ON e.department_id = d.department_id;
    
  • Cập nhật materialized view: Materialized views cần được cập nhật định kỳ để đảm bảo dữ liệu luôn mới nhất.

      REFRESH MATERIALIZED VIEW mv_employee_department;
    
16.3.2. So sánh với regular views
  • Regular Views:

    • Không lưu trữ dữ liệu thực tế.

    • Kết quả được tính toán mỗi lần truy vấn.

    • Phù hợp cho các truy vấn đơn giản và không yêu cầu hiệu suất cao.

  • Materialized Views:

    • Lưu trữ dữ liệu thực tế.

    • Kết quả được lưu trữ và có thể được cập nhật định kỳ.

    • Phù hợp cho các truy vấn phức tạp và yêu cầu hiệu suất cao.


Kết luận

Views là một công cụ mạnh mẽ giúp đơn giản hóa các truy vấn phức tạp, tăng tính bảo mật và tái sử dụng logic truy vấn. Tuy nhiên, việc sử dụng views cần được cân nhắc kỹ lưỡng để tránh các vấn đề về hiệu suất. Materialized views là một giải pháp hiệu quả cho các truy vấn phức tạp và yêu cầu hiệu suất cao. Trong các bài tiếp theo, chúng ta sẽ đi sâu vào các kỹ thuật tối ưu hóa khác, chẳng hạn như sử dụng temporary tables và window functions.


Từ vựng chuyên môn (Glossary)

  • Views: Bảng ảo.

  • Regular Views: Views thông thường.

  • Materialized Views: Views vật lý.

  • Query Simplification: Đơn giản hóa truy vấn.

  • Data Security: Bảo mật dữ liệu.

  • Query Performance: Hiệu suất truy vấn.

  • JOIN: Phép kết hợp dữ liệu từ nhiều bảng.

  • Subquery: Truy vấn con.

  • Cache Invalidation: Vô hiệu hóa bộ nhớ đệm.

  • Data Consistency: Tính nhất quán của dữ liệu.