2015-05-30 17 views
5

Sto cercando di capire l'ottimizzazione della query in postgresql e ho una funzione con alcune query in esso. Alcuni di loro sono semplici querys che salva un valore in una variabile e poi la prossima query richiede questa variabile per trovare qualcosa .. Diciamo:postgreSQL spiegare analizzare una funzione

function()... 
select type into t 
from tableA 
where code = a_c; 

select num into n 
from tableB 
where id = t; 
end function... 

e molti altri .. Se voglio spiegare analizzare l'intera funzione Eseguo il comando spiega analizza select function(); È questo il modo giusto per farlo o dovrei spiegare analizzare ogni query all'interno della funzione e, in caso affermativo, con quali valori?

+0

Se "spieghi analizzare" per ogni singola query, si sarà in grado di vedere se una determinata query può essere ottimizzato Non sei sicuro di come funzioni sul livello della funzione e se abbia senso. – Ashalynd

+2

Puoi mettere la funzione body in una cosa 'PREPARE (arg1, arg2, ...) AS ... corpo originale ...; 'e lo chiamo usando' explain analizzare execute thing (args); ' – wildplasser

+0

@wildplasser c'è un errore con le dichiarazioni dichiarate all'interno del corpo e se non le dichiaro ottengo questo errore: le istruzioni di utilità non possono essere preparate –

risposta

4

Si consiglia di utilizzare il modulo auto_explain:

The auto_explain module provides a means for logging execution plans of slow statements automatically, without having to run EXPLAIN by hand. This is especially helpful for tracking down un-optimized queries in large applications.

con auto_explain.log_nested_statements acceso:

auto_explain.log_nested_statements (boolean)

auto_explain.log_nested_statements causes nested statements (statements executed inside a function) to be considered for logging. When it is off, only top-level query plans are logged. This parameter is off by default. Only superusers can change this setting.

+0

Ho provato a farlo, ma l'output che ho ottenuto è ciò che la funzione restituisce. il codice che ho usato è: LOAD 'auto_explain'; SET auto_explain.log_min_duration = 0; SET auto_explain.log_analyze = true; SET auto_explain.log_nested_statements = on; selezionare find_4(); –

+0

I risultati di 'explain' fatti da questo modulo vanno nel log del server, non cambiano l'output che si ottiene. –

+0

Non funziona ... non nel registro – Pencilcheck

Problemi correlati