2015-03-26 11 views
5

Sto cercando di salvare manualmente piano di ottimizzazione per ulteriori analisi, in questo modo:Spiegare - inserti solo una riga

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

Ma quando seleziono un secondo momento, lo vedo solo salvato prima fila dalla dichiarazione spiegare :

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

Come posso fare per salvare l'intero piano?

+1

È necessario un ciclo sul risultato dello spiegare. Ogni riga dell'output del piano è una riga. –

+0

@a_horse_with_no_name quando sto cercando di fare '(per c in (spiegare (...))' che mi dà errore di sintassi. – JustMe

risposta

1

Perché explain non può essere utilizzato come ad es. a SELECT questo è un po 'complicato e hai bisogno di SQL dinamico per questo.

Di seguito ha lavorato per me:

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

Avere la dichiarazione di essere spiegato in una stringa rende le cose un po 'più complicato.

Se avevo bisogno che su base regolare, probabilmente creare una funzione che fa questo:

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; 

Poi si può fare qualcosa di simile:

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