Bài 17: Tối ưu Query với Temporary Tables

Temporary tables (bảng tạm thời) là một công cụ mạnh mẽ trong SQL, cho phép bạn lưu trữ dữ liệu tạm thời trong quá trình thực thi các truy vấn phức tạp. Chúng thường được sử dụng để chia nhỏ các truy vấn lớn thành các phần nhỏ hơn, dễ quản lý hơn. Tuy nhiên, nếu không được sử dụng đúng cách, temporary tables có thể gây ra các vấn đề về hiệu suất và quản lý bộ nhớ. Bài viết này sẽ đi sâu vào khái niệm temporary tables, cách sử dụng chúng để tối ưu hóa truy vấn, và so sánh với các kỹ thuật khác như CTE và subquery.


17.1. Temporary Tables là gì?

Temporary tables là các bảng được tạo ra để lưu trữ dữ liệu tạm thời trong quá trình thực thi một phiên làm việc hoặc một truy vấn. Chúng thường được sử dụng để lưu trữ kết quả trung gian của các truy vấn phức tạp.

17.1.1. Cách tạo và sử dụng temporary tables
  • Cú pháp tạo temporary table:

      CREATE TEMPORARY TABLE temp_table_name (
          column1 datatype,
          column2 datatype,
          ...
      );
    
  • Ví dụ: Tạo một temporary table để lưu trữ thông tin nhân viên từ một phòng ban cụ thể:

      CREATE TEMPORARY TABLE temp_employees AS
      SELECT employee_id, first_name, last_name
      FROM employees
      WHERE department_id = 1;
    
  • Sử dụng temporary table: Bạn có thể sử dụng temporary table như một bảng thông thường trong các truy vấn SQL.

      SELECT * FROM temp_employees WHERE last_name = 'Smith';
    
  • Xóa temporary table: Temporary tables thường được tự động xóa khi phiên làm việc kết thúc, nhưng bạn cũng có thể xóa chúng thủ công.

      DROP TEMPORARY TABLE IF EXISTS temp_employees;
    
17.1.2. Ưu và nhược điểm của temporary tables
  • Ưu điểm:

    • Lưu trữ dữ liệu tạm thời: Temporary tables cho phép lưu trữ dữ liệu tạm thời mà không ảnh hưởng đến các bảng chính.

    • Hiệu suất: Temporary tables có thể cải thiện hiệu suất của các truy vấn phức tạp bằng cách chia nhỏ chúng thành các phần nhỏ hơn.

    • Tính độc lập: Dữ liệu trong temporary tables chỉ tồn tại trong phiên làm việc hiện tại, giúp tránh xung đột với các phiên làm việc khác.

  • Nhược điểm:

    • Quản lý bộ nhớ: Temporary tables sử dụng bộ nhớ tạm thời, và nếu không được quản lý đúng cách, chúng có thể gây ra các vấn đề về hiệu suất.

    • Khó bảo trì: Việc sử dụng quá nhiều temporary tables có thể làm cho mã nguồn trở nên khó đọc và khó bảo trì.


17.2. Tối ưu query với temporary tables

Temporary tables 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.

17.2.1. Sử dụng temporary tables để xử lý dữ liệu tạm thời
  • 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ể làm chậm hiệu suất.

  • Giải pháp: Sử dụng temporary tables để lưu trữ kết quả trung gian của các truy vấn phức tạp, giúp chia nhỏ truy vấn thành các phần đơn giản hơn.

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

        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 TEMPORARY TABLE temp_employees 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 TEMPORARY TABLE temp_projects AS
        SELECT p.manager_id, p.project_name
        FROM projects p
        WHERE p.status = 'Active';
      
        SELECT te.*, tp.project_name
        FROM temp_employees te
        LEFT JOIN temp_projects tp ON te.employee_id = tp.manager_id;
      
17.2.2. Tránh lạm dụng temporary tables
  • Vấn đề: Sử dụng quá nhiều temporary tables có thể làm tăng độ phức tạp của mã nguồn và gây ra các vấn đề về hiệu suất.

  • Giải pháp: Chỉ sử dụng temporary tables khi thực sự cần thiết và cân nhắc sử dụng các kỹ thuật khác như CTE hoặc subquery.

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

        CREATE TEMPORARY TABLE temp1 AS SELECT * FROM table1 WHERE condition1;
        CREATE TEMPORARY TABLE temp2 AS SELECT * FROM table2 WHERE condition2;
        CREATE TEMPORARY TABLE temp3 AS SELECT * FROM table3 WHERE condition3;
        SELECT * FROM temp1 JOIN temp2 ON temp1.id = temp2.id JOIN temp3 ON temp2.id = temp3.id;
      
    • Ví dụ tối ưu:

        WITH cte1 AS (SELECT * FROM table1 WHERE condition1),
             cte2 AS (SELECT * FROM table2 WHERE condition2),
             cte3 AS (SELECT * FROM table3 WHERE condition3)
        SELECT * FROM cte1 JOIN cte2 ON cte1.id = cte2.id JOIN cte3 ON cte2.id = cte3.id;
      

17.3. So sánh với CTE và Subquery

Temporary tables, CTE (Common Table Expressions), và subquery là các công cụ khác nhau để xử lý dữ liệu tạm thời trong SQL. Mỗi công cụ có ưu và nhược điểm riêng, và việc lựa chọn công cụ phù hợp phụ thuộc vào yêu cầu cụ thể của truy vấn.

17.3.1. Khi nào nên sử dụng temporary tables
  • Dữ liệu lớn: Temporary tables phù hợp khi cần xử lý một lượng lớn dữ liệu tạm thời.

  • Truy vấn phức tạp: Temporary tables giúp chia nhỏ các truy vấn phức tạp thành các phần đơn giản hơn.

  • Tái sử dụng dữ liệu: Temporary tables cho phép tái sử dụng dữ liệu tạm thời trong nhiều truy vấn khác nhau.

17.3.2. Đánh đổi giữa temporary tables và CTE
  • Temporary Tables:

    • Ưu điểm: Lưu trữ dữ liệu tạm thời, có thể tái sử dụng trong nhiều truy vấn.

    • Nhược điểm: Sử dụng bộ nhớ tạm thời, có thể làm chậm hiệu suất nếu không được quản lý đúng cách.

  • CTE:

    • Ưu điểm: Không cần lưu trữ dữ liệu tạm thời, dễ đọc và bảo trì.

    • Nhược điểm: Không phù hợp cho các truy vấn phức tạp với lượng dữ liệu lớn.


Kết luận

Temporary tables là một công cụ mạnh mẽ giúp tối ưu hóa các truy vấn phức tạp bằng cách chia nhỏ chúng thành các phần đơn giản hơn. Tuy nhiên, việc sử dụng temporary tables cần được cân nhắc kỹ lưỡng để tránh các vấn đề về hiệu suất và quản lý bộ nhớ. 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 window functions và indexed views.


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

  • Temporary Tables: Bảng tạm thời.

  • CTE (Common Table Expressions): Biểu thức bảng chung.

  • Subquery: Truy vấn con.

  • Query Optimization: Tối ưu hóa truy vấn.

  • Data Processing: Xử lý dữ liệu.

  • Memory Management: Quản lý bộ nhớ.

  • Complex Queries: Truy vấn phức tạp.

  • Data Reusability: Khả năng tái sử dụng dữ liệu.

  • Performance Issues: Vấn đề về hiệu suất.

  • Session: Phiên làm việc.