Planista ma problem z Twoim zapytaniem, ponieważ nie może oszacować czasu wykonania funkcji. W tym przypadku planista otrzymuje szacunkowy koszt wykonania funkcji, który można zdefiniować w create function...
lub alter function...
. Jeśli jednak spróbujesz tego zapytania:
explain analyse select * from test(10);
zobaczysz, że czas wykonania jest znacznie bardziej realistyczny.
Porównaj:
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)
kontra:
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)
Zwróć uwagę na podobieństwo dwóch ostatnich planów. Funkcje tabelowe (funkcje, które zwracają zestaw wierszy lub tabelę jak w tym przypadku) powinny być wywoływane w FROM
klauzula. Pod pewnymi warunkami mogą być inline.
Przeczytaj więcej:Wstawianie funkcji SQL .