2015-03-26 21 views
5

próbuję ręcznie zapisać planu optymalizujący do dalszej analizy, tak:Wyjaśnić - wkładki tylko jeden wiersz

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

Ale kiedy go wybrać później, widzę to tylko pierwszy wiersz zapisany z rachunku wyjaśnienia :

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

Jak mogę to zrobić, aby zapisać cały plan?

+1

Trzeba pętlę na skutek wyjaśnienia. Każda linia wyjścia planu to jeden wiersz. –

+0

@a_horse_with_no_name, gdy próbuję zrobić '(dla c w (wyjaśnić (...))', że daje mi błąd składni. – JustMe

Odpowiedz

1

Ponieważ explain nie może być używany, np. a SELECT jest to nieco skomplikowane i do tego potrzebny jest dynamiczny SQL.

Następujące pracował dla mnie:

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; 
$$ 

uwzględniając oświadczenie należy wyjaśnić w ciągu znaków sprawia, że ​​rzeczy nieco bardziej skomplikowane.

Jeżeli Potrzebowałem tego regularnie, to pewnie utworzyć funkcję, która wykonuje to:

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; 

Następnie można zrobić coś takiego:

insert into plans 
select * 
from explain('select ...');