PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Leistung – SELECT vs. gespeicherte Funktion

Der Planer hat ein Problem mit Ihrer Abfrage, da er die Ausführungszeit der Funktion nicht auswerten kann. In diesem Fall erhält der Planer die geschätzten Ausführungskosten der Funktion, die in create function... definiert werden können oder alter function... . Wenn Sie jedoch diese Abfrage versuchen:

explain analyse select * from test(10);

Sie werden sehen, dass die Ausführungszeit viel realistischer ist.

Vergleichen Sie:

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)

gegen:

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)

Beachten Sie die Ähnlichkeit der beiden letzten Pläne. Tabellenfunktionen (Funktionen, die wie in diesem Fall eine Reihe von Zeilen oder eine Tabelle zurückgeben) sollten in FROM aufgerufen werden Klausel. Unter bestimmten Bedingungen können sie inliniert werden.

Lesen Sie mehr:Inlining von SQL-Funktionen .