sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-prestaties - SELECT vs Stored-functie

De planner heeft een probleem met uw query omdat deze de uitvoeringstijd van de functie niet kan evalueren. In dit geval krijgt de planner de geschatte uitvoeringskosten van de functie, die kunnen worden gedefinieerd in create function... of alter function... . Als u echter deze zoekopdracht probeert:

explain analyse select * from test(10);

je zult zien dat de uitvoeringstijd veel realistischer is.

Vergelijk:

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)

versus:

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)

Let op de gelijkenis van de twee laatste plannen. Tabelfuncties (functies die een reeks rijen of tabellen retourneren zoals in dit geval) moeten worden aangeroepen in FROM clausule. Onder bepaalde voorwaarden kunnen ze inline worden geplaatst.

Lees meer:​​Inlining van SQL-functies .




  1. De nieuwe hittegolf van MySQL begrijpen

  2. hernoem tabel naar 'NOW() + old_table_name'

  3. Verleen privileges aan alle gebruikers, huidige en toekomstige

  4. Het niet-vastgelegde isolatieniveau lezen