Performance Tuning Functions
We had a problem with performance on a function that calls lots of other funcitons.
Here is how we found which function was causing the problem.
First, add this line to your poastgres.conf file
track_functions = pl
Then, run your function.
Finally, analyze the results as show below.
Script started on Thu 21 Jul 2011 04:34:23 PM PDT
bash-3.2$ exitscreen[2Ppsql
psql (9.0.4)
Type "help" for help.
postgres=# \qselect * from pg_stat_user_functions;
postgres=# \c eas_prod [K
You are now connected to database "eas_prod".
eas_prod=# \c eas_prod q[Kselect * from pg_stat_user_functions;
funcid | schemaname | funcname | calls | total_time | self_time
--------+------------+----------------------------------+--------+------------+-----------
763121 | avs | process_address_parcel_link | 190570 | 150040 | 102882
404372 | avs | delete_addresses | 1 | 322 | 322
404371 | avs | init_streets_nearest | 1 | 343549 | 343549
404369 | avs | init_avs_addresses | 1 | 592559 | 592442
404370 | avs | init_parcel_points | 1 | 22349 | 22349
404183 | public | _sfmad_address_base_history | 152567 | 16930941 | 16930941
404185 | public | _sfmad_addresses_history | 178206 | 26794 | 26794
404187 | public | _sfmad_address_x_parcels_history | 195119 | 47157 | 47157
404299 | public | _eas_is_date | 9177 | 116 | 116
404305 | public | _eas_insert_base_address | 152567 | 17038590 | 84753
404306 | public | _eas_insert_unit_address | 25639 | 9126 | 5227
404308 | public | _eas_find_equiv_unit_address | 26801 | 2072 | 2072
404373 | avs | find_address_base | 191515 | 81506 | 81506
404374 | avs | find_nearest_street | 306329 | 53249 | 53249
404375 | avs | find_nearest_street_fancy | 153396 | 120053 | 66804
404376 | avs | process_address_base | 191515 | 17762263 | 522113
404377 | avs | process_address_unit | 190686 | 25695 | 14496
404379 | avs | cascade_retire | 1 | 220 | 220
404380 | avs | load | 20 | 18007181 | 68961
(19 rows)
eas_prod=# select * from pg_stat_user_functions;
eas_prod=# [Kselect func[K[K[K[Ksceh[K[Khemaname, funcname, ( calls[K[K[K[K[Ktotal_time/calls) as avg_tot_time, (self_time/calls as avg>[K_self_time)[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K[K) as avg_self_time;[K from pg_stat_user_functions;
schemaname | funcname | avg_tot_time | avg_self_time
------------+----------------------------------+--------------+---------------
avs | process_address_parcel_link | 0 | 0
avs | delete_addresses | 322 | 322
avs | init_streets_nearest | 343549 | 343549
avs | init_avs_addresses | 592559 | 592442
avs | init_parcel_points | 22349 | 22349
public | _sfmad_address_base_history | 110 | 110
public | _sfmad_addresses_history | 0 | 0
public | _sfmad_address_x_parcels_history | 0 | 0
public | _eas_is_date | 0 | 0
public | _eas_insert_base_address | 111 | 0
public | _eas_insert_unit_address | 0 | 0
public | _eas_find_equiv_unit_address | 0 | 0
avs | find_address_base | 0 | 0
avs | find_nearest_street | 0 | 0
avs | find_nearest_street_fancy | 0 | 0
avs | process_address_base | 92 | 2
avs | process_address_unit | 0 | 0
avs | cascade_retire | 220 | 220
avs | load | 900359 | 3448
(19 rows)
eas_prod=# select schemaname, funcname, ( total_time/calls) as avg_tot_time, (self_time/calls) as avg_self_time from pg_stat_user_functions;
eas_prod=# select schemaname, funcname, ( total_time/calls) as avg_tot_time, (self_time/calls[1@:[1@:[1@n[1@u[1@m[1@e[1@r[1@i[1@c[1@:[1@:[1@n[1@u[1@m[1@er) as avg_tot_time, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions; M
eas_prod=# select schemaname, funcname, ( total_time/calls::numeri) as avg_tot_time, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions;
;M
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric) as avg_tot_time, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions;M
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric
schemaname | funcname | avg_tot_time | avg_self_time
------------+----------------------------------+------------------------+------------------------
avs | process_address_parcel_link | 0.78732224379493099648 | 0.53986461667628692869
avs | delete_addresses | 322.0000000000000000 | 322.0000000000000000
avs | init_streets_nearest | 343549.000000000000 | 343549.000000000000
avs | init_avs_addresses | 592559.000000000000 | 592442.000000000000
avs | init_parcel_points | 22349.000000000000 | 22349.000000000000
public | _sfmad_address_base_history | 110.9738082285159963 | 110.9738082285159963
public | _sfmad_addresses_history | 0.15035408459872282639 | 0.15035408459872282639
public | _sfmad_address_x_parcels_history | 0.24168328045961695171 | 0.24168328045961695171
public | _eas_is_date | 0.01264029639315680506 | 0.01264029639315680506
public | _eas_insert_base_address | 111.6793933157235837 | 0.55551331546140384225
public | _eas_insert_unit_address | 0.35594211942743476735 | 0.20386910565934708842
public | _eas_find_equiv_unit_address | 0.07731054811387634790 | 0.07731054811387634790
avs | find_address_base | 0.42558546327963867060 | 0.42558546327963867060
avs | find_nearest_street | 0.17382944481260344270 | 0.17382944481260344270
avs | find_nearest_street_fancy | 0.78263448851339017967 | 0.43550027380114214191
avs | process_address_base | 92.7460668877111453 | 2.7262250998616296
avs | process_address_unit | 0.13475032251974450143 | 0.07602026367955696800
avs | cascade_retire | 220.0000000000000000 | 220.0000000000000000
avs | load | 900359.050000000000 | 3448.0500000000000000
(19 rows)
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric) as avg_tot_time, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions
s;
M
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric) as avg_tot_time, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functio (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions;[KM
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric) as avg_tot_time (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions;
[KM
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric) as avg_tot_tim[1P
[KM
eas_prod=# select schemaname, funcname, ( total_time/calls::numeric) as avg_tot_ti[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1P[1@1[1@0[1@0[1@0[1@:[1@:[1@n[1@u[1@m[1@e[1@r[1@i[1@c[1@)
eas_prod=# select schemaname, funcname, ( total_time/1000::numeric) [1@ [1@a[1@s
eas_prod=# select schemaname, funcname, ( total_time/1000::numeric) as [1@ [1@t[1@o[1@t[1@a[1@l[1@_[1@s[1@,
schemaname | funcname | total_s | avg_self_time
------------+----------------------------------+------------------------+------------------------
avs | process_address_parcel_link | 150.0400000000000000 | 0.53986461667628692869
avs | delete_addresses | 0.32200000000000000000 | 322.0000000000000000
avs | init_streets_nearest | 343.5490000000000000 | 343549.000000000000
avs | init_avs_addresses | 592.5590000000000000 | 592442.000000000000
avs | init_parcel_points | 22.3490000000000000 | 22349.000000000000
public | _sfmad_address_base_history | 16930.941000000000 | 110.9738082285159963
public | _sfmad_addresses_history | 26.7940000000000000 | 0.15035408459872282639
public | _sfmad_address_x_parcels_history | 47.1570000000000000 | 0.24168328045961695171
public | _eas_is_date | 0.11600000000000000000 | 0.01264029639315680506
public | _eas_insert_base_address | 17038.590000000000 | 0.55551331546140384225
public | _eas_insert_unit_address | 9.1260000000000000 | 0.20386910565934708842
public | _eas_find_equiv_unit_address | 2.0720000000000000 | 0.07731054811387634790
avs | find_address_base | 81.5060000000000000 | 0.42558546327963867060
avs | find_nearest_street | 53.2490000000000000 | 0.17382944481260344270
avs | find_nearest_street_fancy | 120.0530000000000000 | 0.43550027380114214191
avs | process_address_base | 17762.263000000000 | 2.7262250998616296
avs | process_address_unit | 25.6950000000000000 | 0.07602026367955696800
avs | cascade_retire | 0.22000000000000000000 | 220.0000000000000000
avs | load | 18007.181000000000 | 3448.0500000000000000
(19 rows)
eas_prod=# select schemaname, funcname, ( total_time/1000::numeric) as total_s, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions;[1P[1@6
eas_prod=# select schemaname, funcname, ( total_time/6000[1@0
eas_prod=# select schemaname, funcname, ( total_time/600
eas_prod=# select schemaname, funcname, ( total_time/6000
eas_prod=# select schemaname, funcname, ( total_time/60000
eas_prod=# select schemaname, funcname, ( total_time/60000:
eas_prod=# select schemaname, funcname, ( total_time/60000::
eas_prod=# select schemaname, funcname, ( total_time/60000::n
eas_prod=# select schemaname, funcname, ( total_time/60000::nu
eas_prod=# select schemaname, funcname, ( total_time/60000::num
eas_prod=# select schemaname, funcname, ( total_time/60000::nume
eas_prod=# select schemaname, funcname, ( total_time/60000::numer
eas_prod=# select schemaname, funcname, ( total_time/60000::numeri
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric)
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric)
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) a
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as t
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as to
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as tot
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as tota
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as total
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as total_
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as total_s[1P[1@m
schemaname | funcname | total_m | avg_self_time
------------+----------------------------------+------------------------+------------------------
avs | process_address_parcel_link | 2.5006666666666667 | 0.53986461667628692869
avs | delete_addresses | 0.00536666666666666667 | 322.0000000000000000
avs | init_streets_nearest | 5.7258166666666667 | 343549.000000000000
avs | init_avs_addresses | 9.8759833333333333 | 592442.000000000000
avs | init_parcel_points | 0.37248333333333333333 | 22349.000000000000
public | _sfmad_address_base_history | 282.1823500000000000 | 110.9738082285159963
public | _sfmad_addresses_history | 0.44656666666666666667 | 0.15035408459872282639
public | _sfmad_address_x_parcels_history | 0.78595000000000000000 | 0.24168328045961695171
public | _eas_is_date | 0.00193333333333333333 | 0.01264029639315680506
public | _eas_insert_base_address | 283.9765000000000000 | 0.55551331546140384225
public | _eas_insert_unit_address | 0.15210000000000000000 | 0.20386910565934708842
public | _eas_find_equiv_unit_address | 0.03453333333333333333 | 0.07731054811387634790
avs | find_address_base | 1.3584333333333333 | 0.42558546327963867060
avs | find_nearest_street | 0.88748333333333333333 | 0.17382944481260344270
avs | find_nearest_street_fancy | 2.0008833333333333 | 0.43550027380114214191
avs | process_address_base | 296.0377166666666667 | 2.7262250998616296
avs | process_address_unit | 0.42825000000000000000 | 0.07602026367955696800
avs | cascade_retire | 0.00366666666666666667 | 220.0000000000000000
avs | load | 300.1196833333333333 | 3448.0500000000000000
(19 rows)
eas_prod=# select schemaname, funcname, ( total_time/60000::numeric) as total_m, (self_time/calls::numeric) as avg_self_time from pg_stat_user_functions;
eas_prod=# select schemaname, funcname, ( total[1P[1P[1P[1P[1P[1@s[1@e[1@l[1@f
schemaname | funcname | total_m | avg_self_time
------------+----------------------------------+------------------------+------------------------
avs | process_address_parcel_link | 1.7147000000000000 | 0.53986461667628692869
avs | delete_addresses | 0.00536666666666666667 | 322.0000000000000000
avs | init_streets_nearest | 5.7258166666666667 | 343549.000000000000
avs | init_avs_addresses | 9.8740333333333333 | 592442.000000000000
avs | init_parcel_points | 0.37248333333333333333 | 22349.000000000000
public | _sfmad_address_base_history | 282.1823500000000000 | 110.9738082285159963
public | _sfmad_addresses_history | 0.44656666666666666667 | 0.15035408459872282639
public | _sfmad_address_x_parcels_history | 0.78595000000000000000 | 0.24168328045961695171
public | _eas_is_date | 0.00193333333333333333 | 0.01264029639315680506
public | _eas_insert_base_address | 1.4125500000000000 | 0.55551331546140384225
public | _eas_insert_unit_address | 0.08711666666666666667 | 0.20386910565934708842
public | _eas_find_equiv_unit_address | 0.03453333333333333333 | 0.07731054811387634790
avs | find_address_base | 1.3584333333333333 | 0.42558546327963867060
avs | find_nearest_street | 0.88748333333333333333 | 0.17382944481260344270
avs | find_nearest_street_fancy | 1.11340000000000000000 | 0.43550027380114214191
avs | process_address_base | 8.7018833333333333 | 2.7262250998616296
avs | process_address_unit | 0.24160000000000000000 | 0.07602026367955696800
avs | cascade_retire | 0.00366666666666666667 | 220.0000000000000000
avs | load | 1.14935000000000000000 | 3448.0500000000000000
(19 rows)
eas_prod=# select null is not distinct from numm[K[Kll;
?column?
----------
t
(1 row)
eas_prod=# select null is not distinct from null;[1P[1P[1P[1P[1@1
?column?
----------
f
(1 row)
eas_prod=# \q
bash-3.2$ exit
exit
Script done on Thu 21 Jul 2011 05:01:33 PM PDT