2015-05-30 39 views
5

Próbuję zrozumieć optymalizacji kwerendy w postgresql i mam funkcję z niektórych zapytań w nim. Niektóre z nich są proste querys że zapisuje wartość do zmiennej, a następnie obok zapytanie trwa tę zmienną, aby znaleźć coś .. powiedzmy:wyjaśnienie postgreSQL analizować funkcję

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

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

i wiele innych .. Jeśli chcę wyjaśnić analizować całą funkcję Wykonuję polecenie explain analyze analyze select function(); Czy jest to właściwy sposób postępowania, czy też powinienem wyjaśnić, analizować każde zapytanie wewnątrz funkcji, a jeśli tak, jakie wartości?

+0

Jeśli nie „wyjaśnić analizować” dla każdego indywidualnego zapytania, będzie mógł sprawdzić, czy dana zapytania można zoptymalizować. Nie wiesz, jak to działa na poziomie funkcji i czy ma to sens. – Ashalynd

+2

Możesz umieścić ciało funkcji na rzecz 'PREPARE (arg1, arg2, ...) AS ... oryginalne ciało ...; 'i wywołaj to za pomocą' wyjaśnij, przeanalizuj, wykonaj rzecz (args); ' – wildplasser

+0

@wildplasser wystąpił błąd w deklaracji instrukcji wewnątrz ciała i jeśli ich nie zadeklaruję, otrzymuję ten błąd: nie można przygotować instrukcji narzędziowych –

Odpowiedz

4

Rozważ użycie modułu 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.

z auto_explain.log_nested_statements włączone:

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

Próbowałem to zrobić, ale dane wyjściowe mam to, co funkcja zwraca. kod użyłem: LOAD 'auto_explain'; SET auto_explain.log_min_duration = 0; SET auto_explain.log_analyze = true; SET auto_explain.log_nested_statements = on; wybierz find_4(); –

+0

Wyniki "wyjaśnienia" wykonane przez ten moduł trafiają do logu serwera, nie zmieniają otrzymanych wyników. –

+0

Nie działa ... nie ma w ogóle logu – Pencilcheck