2024-06-13 22:28 — 4 phút đọc

[DB] - Database Cost

#sql#database#relation#cost


“Cost” trong SQL là gì?

Trong SQL, “cost” là một ước lượng về lượng thời gian CPU và I/O đĩa mà máy chủ phải dành để thực thi một truy vấn. Đây không phải là thời gian thực tế mà là một đơn vị ước lượng, thường được chia thành nhiều thành phần như chi phí phân tích truy vấn, chi phí lấy dữ liệu từ đĩa và truy cập chỉ mục nếu nó giảm chi phí, chi phí thực hiện các phép toán trên dữ liệu, chi phí nhóm hoặc sắp xếp dữ liệu, và chi phí gửi dữ liệu trở lại cho client.

Cost in SQL

Ví dụ, trong PostgreSQL, một truy vấn EXPLAIN sẽ trả về kế hoạch thực thi được tạo ra bởi trình lập kế hoạch truy vấn của PostgreSQL cho một câu lệnh cụ thể. Nó chỉ ra liệu các bảng được tham chiếu trong một câu lệnh sẽ được tìm kiếm bằng cách sử dụng quét chỉ mục hay quét tuần tự.

Các chi phí được hiển thị trong kết quả của lệnh EXPLAIN bao gồm:

  • Chi phí ban đầu (Startup cost): Ước lượng thời gian cần thiết để lấy hàng đầu tiên. Ví dụ, cho một quét tuần tự, chi phí khởi động sẽ gần như bằng không, vì nó có thể bắt đầu lấy hàng ngay lập tức. Đối với một hoạt động sắp xếp, nó sẽ cao hơn vì một phần lớn công việc cần được thực hiện trước khi hàng có thể bắt đầu được trả về.

  • Tổng chi phí (Total cost): Là chi phí sau chi phí khởi động và hai dấu chấm, đại diện cho tổng chi phí của hoạt động. Tổng chi phí thường bao gồm chi phí của các hoạt động trước đó.

Các đơn vị chi phí là tùy ý và không phải là thời gian thực tế như mili giây hay bất kỳ đơn vị thời gian nào khác. Chúng được neo (theo mặc định) vào việc đọc một trang tuần tự chi phí 1.0 đơn vị (seq_page_cost). Mỗi hàng được xử lý thêm 0.01 (cpu_tuple_cost), và mỗi lần đọc trang không tuần tự thêm 4.0 (random_page_cost). Có nhiều hằng số khác như vậy, tất cả đều có thể cấu hình.

Tối ưu hóa “Cost” trong SQL

Để tối ưu hóa chi phí (cost) trong PostgreSQL, bạn có thể thực hiện một số bước sau đây:

  1. Thiết kế Cơ sở dữ liệu: Tối ưu hóa thiết kế cơ sở dữ liệu bằng cách phân vùng dữ liệu thành nhiều bảng được tách biệt một cách logic thay vì sử dụng một bảng lớn. Điều này thường mang lại cải thiện đáng kể và ngay lập tức về hiệu suất truy vấn.

  2. Sử dụng Chỉ mục (Indexes): Tạo chỉ mục trên các cột thường được sử dụng làm bộ lọc trong các truy vấn thường xuyên chạy nhất. Điều này giúp lọc bớt dữ liệu để có ít dữ liệu hơn cần xử lý.

  3. Cấu hình Cơ sở dữ liệu: Điều chỉnh các tham số cấu hình cơ sở dữ liệu để phù hợp với trường hợp sử dụng cụ thể của bạn. Một số tham số quan trọng có thể được tinh chỉnh bao gồm shared_buffers, work_mem, maintenance_work_mem, và effective_cache_size.

  4. Tối ưu hóa Truy vấn: Sử dụng lệnh EXPLAIN để phân tích kế hoạch thực thi của truy vấn và tìm kiếm cơ hội để tối ưu hóa. Điều này có thể bao gồm việc viết lại truy vấn để sử dụng các kỹ thuật hiệu quả hơn như sử dụng INNER JOIN thay vì OUTER JOIN, hoặc sử dụng UNION ALL thay vì UNION.

  5. Vacuum và Autovacuum: Đảm bảo rằng bạn chạy VACUUM thường xuyên để giải phóng không gian không được sử dụng và giữ cho cơ sở dữ liệu của bạn hoạt động một cách hiệu quả.

  6. Giám sát và Đánh giá: Sử dụng công cụ giám sát để theo dõi hiệu suất của cơ sở dữ liệu và đánh giá các cấu hình hiện tại để xác định cơ hội tối ưu hóa.

  7. Cân nhắc về Phần cứng và Hệ điều hành: Tối ưu hóa cấu hình phần cứng và hệ điều hành có thể ảnh hưởng đến hiệu suất của PostgreSQL. Điều này bao gồm việc cân nhắc về loại ổ cứng, cấu hình bộ nhớ, và các thiết lập hệ điều hành.

Nhớ rằng, mỗi trường hợp sử dụng là duy nhất và các chiến lược tối ưu hóa có thể khác nhau tùy thuộc vào yêu cầu cụ thể của bạn. Đôi khi, việc thử nghiệm và điều chỉnh là cần thiết để đạt được hiệu suất tốt nhất.


Tham khảo

  1. What does cost of SQL statement mean? - Stack Overflow.

  2. What Is The Cost In PostgreSQL EXPLAIN Query - ScaleGrid.

  3. Cost in SQL Server - SQLJared.

  4. How to optimize costs - Azure Database for PostgreSQL - Flexible Server

  5. Azure Database for PostgreSQL Cost Optimization - SQL Shack.

  6. PostgreSQL Performance Tuning and Optimization Guide - Sematext.

  7. PostgreSQL Queries: How to Write and Optimize Them.

  8. Step 1: EXPLAIN Costs and Plans in PostgreSQL – Part 2 - Highgo.


aitu avatar

Hi! Tôi là Tuyên — Hiện tại tôi đang làm Software Architect, Senior developer tại một công ty nhỏ ở Hà Nội. Tôi cảm thấy thích thú, đam mê, yêu thích với việc viết lách và chia sẻ những kiến thức mà tôi biết. Hãy đọc nhiều hơn tại blogs và tới about để biết thêm về tôi nhé.