我有一個非常基本的 plpgsql 存盤程序,如下所示:
create or replace procedure new_emp_sp (f_name varchar, l_name varchar, age integer, threshold integer)
language plpgsql
as $$
declare
new_emp_count integer;
begin
INSERT INTO employees (id, first_name, last_name, age)
VALUES (nextval('emp_id_seq'),
random_string(10),
random_string(20),
age);
select count(*) into new_emp_count from employees where age > threshold;
update dept_employees set emp_count = new_emp_count where id = 'finance';
end; $$
使用 呼叫此存盤程序后call,如何獲取該程序執行的每個陳述句的查詢計劃?
為類似的要求找到了幾個 StackOverflow 答案,但使用了函式而不是使用auto_explain模塊的程序,我按照以下步驟操作,但它不起作用:
已執行
LOAD '$libdir/plugins/auto_explain';(我正在使用 AWS RDS PostgreSQL 實體并在本檔案中找到此命令)執行
SET auto_explain.log_min_duration = 0;執行
SET auto_explain.log_analyze = true;執行
SET auto_explain.log_nested_statements = true;
但是在執行該程序后,我沒有看到輸出中有任何明顯的變化。
對于我目前的要求,我無法訪問資料庫服務器上的任何日志檔案,只能通過客戶端/以編程方式在服務器上運行命令
uj5u.com熱心網友回復:
您可以將日志訊息發送到客戶端:
set client_min_messages TO log;
這適用于 auto_explain.log_nested_statements (psql無論如何)。我一直使用它來避免需要瀏覽日志檔案。
uj5u.com熱心網友回復:
這是獲取存盤程序/函式的查詢計劃的唯一方法嗎?
還有一種不用安裝的方法auto_explain。該EXPLAIN命令基本上回傳一組text,您可以在 PL/pgSQL 代碼塊中使用它:
CREATE OR REPLACE PROCEDURE pg_temp.get_plan ()
LANGUAGE plpgsql AS
$proc$
DECLARE
_line text;
BEGIN
FOR _line IN
EXPLAIN ANALYZE
SELECT 1 -- your query here !!!
LOOP
RAISE NOTICE '%', _line;
END LOOP;
END
$proc$;
CALL pg_temp.get_plan();
您將進入您的客戶(任何顯示通知的客戶):
NOTICE: Result (cost=0.00..0.01 rows=1 width=4) (actual time=0.004..0.005 rows=1 loops=1)
NOTICE: Planning Time: 0.045 ms
NOTICE: Execution Time: 0.035 ms
CALL
看:
- PL/pgSQL 中的 EXPLAIN ANALYZE 給出錯誤:“查詢沒有結果資料的目的地”
- 用 plpgsql 撰寫的函式呼叫的 Postgres 查詢計劃
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/436668.html
下一篇:帶有保存點的延遲約束觸發器
