GIẢI THÍCH ANALYZE không hiển thị chi tiết cho các truy vấn bên trong hàm plpgsql


18

Tôi đang sử dụng chức năng PL / pgSQL trong PostgreSQL 9.3 với một số truy vấn phức tạp bên trong:

create function f1()
  returns integer as
$$
declare

event tablename%ROWTYPE;
....
....

begin

FOR event IN
   SELECT * FROM tablename WHERE condition
LOOP
   EXECUTE 'SELECT f2(event.columnname)' INTO dummy_return;
END LOOP;

...

INSERT INTO ... FROM a LEFT JOIN b ... LEFT JOIN c WHERE ...

UPDATE T SET cl1 = M.cl1 FROM M WHERE M.pkcols = T.pkcols;

...

end
$$ language plpgsql;

Nếu tôi chạy EXPLAIN ANALYZE f1(), tôi chỉ nhận được tổng thời gian, nhưng không có chi tiết. Có cách nào để tôi có thể nhận kết quả chi tiết cho tất cả các truy vấn trong hàm không?

Nếu các truy vấn trong hàm không được tối ưu hóa bởi Postgres, tôi cũng sẽ yêu cầu một lời giải thích.


2
auto_explain.log_nested_statementscó thể giúp. Xem postgresql.org/docs/9.3/static/auto-explain.html
Daniel Vérité

Câu trả lời:


15

Đầu tiên, cú pháp đúng cho EXPLAINcuộc gọi cần a SELECT. Bạn không thể chỉ viết tên hàm trần trong SQL:

EXPLAIN ANALYZE SELECT f1();

Tối ưu hóa

Các hàm PL / pgSQL là các hộp đen cho trình hoạch định truy vấn. Các truy vấn bên trong được tối ưu hóa giống như các truy vấn khác, nhưng riêng rẽ và từng câu một như các câu lệnh được chuẩn bị và kế hoạch thực hiện có thể được lưu trong bộ nhớ cache trong suốt thời gian của phiên. Chi tiết:

EXPLAIN cơ quan chức năng

Giống như @Daniel đã nhận xét, bạn có thể sử dụng mô-đun bổ sung auto_explain để biết thêm chi tiết ( nhiều chi tiết). Các câu lệnh bên trong các hàm plpgsql được coi là "các câu lệnh lồng nhau". Hãy chắc chắn để thiết lập

SET auto_explain.log_nested_statements = ON

Hướng dẫn chi tiết:

Như một ngoại lệ cho quy tắc, các hàm SQL rất đơn giản (không phải plpgsql) có thể được "nội tuyến", tức là mã hàm được chèn vào truy vấn bên ngoài và mọi thứ được thực thi giống như không có hàm bắt đầu. Kế hoạch truy vấn bao gồm thông tin chi tiết trong các trường hợp như vậy.


Sau khi bật 'auto_explain' như bên dưới, hãy tải 'auto_explain'; đặt auto_explain.log_min_duration = 0; đặt auto_explain.log_nested_statements = ON; SET auto_explain.log_analyze = true; Tôi đang nhận được thông báo dưới đây trong tệp nhật ký, '2014-12-08 18:21:59 IST LOG: không thể nhận dữ liệu từ máy khách: Không thể thực hiện kết nối vì máy đích đã từ chối nó' mọi người có thể hướng dẫn tôi không vấn đề thực tế ....
skumar

Lưu ý: Sau khi chạy chức năng plpgsql, tôi chỉ nhận được thông điệp trên tệp nhật ký.
skumar
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.