2015-03-26 17 views
5

Tôi đang cố gắng để tự cứu kế hoạch tối ưu hóa để phân tích thêm, như thế này:Giải thích - chèn chỉ có một hàng

do $$ 
declare 
tmp text; 
begin 
    explain 
    select * from public.some_table where 1=2 into tmp; 
    insert into public.plans(plan) values (tmp); 
end; $$ 

Nhưng khi tôi chọn nó sau này, tôi thấy nó chỉ lưu hàng đầu tiên từ giải thích tuyên bố :

Result (cost=0.00..82.97 rows=1 width=114) 

Tôi làm cách nào để lưu toàn bộ gói?

+1

Bạn cần một vòng lặp qua kết quả giải thích. Mỗi dòng của đầu ra kế hoạch là một hàng. –

+0

@a_horse_with_no_name khi tôi đang cố gắng làm '(cho c trong (giải thích (...))' mà nó cho tôi lỗi cú pháp. – JustMe

Trả lời

1

Vì không thể sử dụng explain như ví dụ: a SELECT điều này hơi phức tạp và bạn cần SQL động cho việc này.

Sau đây làm việc cho tôi:

do 
$$ 
declare 
    plan_line record; 
begin 
    for plan_line in execute 'explain select * from public.some_table where 1=2' loop 
     insert into plans values (plan_line."QUERY PLAN"); 
    end loop; 
end; 
$$ 

Có báo cáo kết quả để được giải thích trong một chuỗi làm cho mọi thứ phức tạp hơn một chút.

Nếu tôi cần điều đó một cách thường xuyên, tôi sẽ có thể tạo ra một chức năng mà thực hiện điều này:

create or replace function explain(to_explain text) 
    returns setof text 
as 
$$ 
declare 
    plan_line record; 
begin 
    for plan_line in execute 'explain '||to_explain loop 
     return next plan_line."QUERY PLAN"; 
    end loop; 
end; 
$$ 
language plpgsql; 

Sau đó, bạn có thể làm điều gì đó như:

insert into plans 
select * 
from explain('select ...'); 
Các vấn đề liên quan