Làm cách nào tôi có thể điểm chuẩn một truy vấn PostgreSQL?


34

Tôi muốn điểm chuẩn một truy vấn có chứa hàm do người dùng xác định mà tôi đã viết cho PostgreSQL. Có cách nào chuẩn để chạy điểm chuẩn như vậy không?

Tôi biết rằng thời gian có thể được bật bằng \timingdấu nhắc psql, nhưng lý tưởng nhất là tôi muốn có một tập lệnh tự động xử lý mọi thứ: chạy truy vấn một vài lần, xóa bộ nhớ cache PostgreQuery sau mỗi lần chạy (có thể bằng cách khởi động lại PostgreQuery dịch vụ) và xuất ra thời gian chạy trung bình (và bộ nhớ được sử dụng là một điểm cộng).


3
Kiểm tra pgbench; bạn có thể chạy nó với các tập lệnh tùy chỉnh để thực hiện một số điều bạn muốn. Với một tập lệnh shell shell để dừng và khởi động lại PG và để xóa bộ đệm đĩa hệ điều hành, bạn có hầu hết những gì bạn cần.
Craig Ringer

Không hoàn toàn là một bản sao của dba.stackexchange.com/questions/3148/ .
Jon của tất cả các giao dịch

Câu trả lời:


29

Công cụ được sử dụng rộng rãi là lệnh SQL EXPLAIN ANALYZE, có thể có nhiều tùy chọn hơn để biết thêm chi tiết trong câu trả lời. Điều đó đưa ra kế hoạch truy vấn với các ước tính kế hoạch cộng với thời gian thực hiện thực tế.

Tại sao bạn muốn xóa bộ nhớ cache? Trường hợp sử dụng thường có nhiều khả năng là bộ đệm được điền. Nếu bạn vẫn muốn đi theo con đường đó, đây là câu trả lời liên quan về SO .

Không đặt lại bộ đệm, đây là hai cách đơn giản để kiểm tra với nhiều lần lặp:

UDF đơn giản

EXPLAIN ANALYZE
SELECT f_myfunc(g) FROM generate_series (1,1000) AS t(g);

Hoặc với đầu vào ngẫu nhiên - các số ngẫu nhiên trong khoảng từ 0 đến 5000 trong ví dụ:

EXPLAIN ANALYZE
SELECT f_myfunc((random()*5000)::int) FROM generate_series (1,1000) AS t(g);

Hoặc với một bảng thực tế cuộc sống:

EXPLAIN ANALYZE
SELECT f_myfunc(my_column) FROM my_tbl;   -- LIMIT n

Các hàm / truy vấn phức tạp hơn

CREATE FUNCTION f_test(ct int, sql text) RETURNS void AS
$func$
DECLARE
   i int;
BEGIN

FOR i IN 1 .. $1 LOOP
    EXECUTE sql;  -- not safe against SQLi!
END LOOP;

END
$func$ LANGUAGE plpgsql

Gọi điện:

EXPLAIN ANALYZE
SELECT f_test(100, $x$SELECT * from MADLIB.gp('mock3', '{x1, x2, x3}', '{y1}', 100,20, 3)$x$

Cẩn thận : Truy vấn được thực hiện!
Cẩn thận : Không phù hợp cho sử dụng công cộng. Có thể tiêm SQL.

Một lần nữa, bạn có thể sử dụng các tham số ngẫu nhiên nếu cần. Có thể với USINGmệnh đề của EXECUTE.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.