“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.
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:
-
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.
-
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ý.
-
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
. -
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ụngINNER JOIN
thay vìOUTER JOIN
, hoặc sử dụngUNION ALL
thay vìUNION
. -
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ả. -
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.
-
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.