Il pianificatore ha un problema con la tua query in quanto non può valutare il tempo di esecuzione della funzione. In questo caso il pianificatore ottiene il costo di esecuzione stimato della funzione, che può essere definito in create function...
o alter function...
. Tuttavia, se provi questa query:
explain analyse select * from test(10);
vedrai i tempi di esecuzione molto più realistici.
Confronta:
test=# explain analyse select test(1000);
QUERY PLAN
------------------------------------------------------------------------------------------
Result (cost=0.00..5.25 rows=1000 width=0) (actual time=0.830..1.220 rows=1000 loops=1)
Planning time: 0.038 ms
Execution time: 1.250 ms
(3 rows)
contro:
test=# explain analyse select * from test(1000);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..37.42 rows=1000 width=4) (actual time=0.006..0.124 rows=1000 loops=1)
-> Seq Scan on test_table (cost=0.00..2560.28 rows=68428 width=4) (actual time=0.005..0.102 rows=1000 loops=1)
Planning time: 0.130 ms
Execution time: 0.144 ms
(4 rows)
test=# explain analyse select * from test_table limit 1000;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..37.42 rows=1000 width=269) (actual time=0.009..0.118 rows=1000 loops=1)
-> Seq Scan on test_table (cost=0.00..2560.28 rows=68428 width=269) (actual time=0.008..0.097 rows=1000 loops=1)
Planning time: 0.076 ms
Execution time: 0.151 ms
(4 rows)
Notare la somiglianza dei due ultimi piani. Le funzioni tabella (funzioni che restituiscono un insieme di righe o tabelle come in questo caso) dovrebbero essere chiamate in FROM
clausola. In determinate condizioni possono essere in linea.
Ulteriori informazioni:Inlining di funzioni SQL .