Yes, use the statistics collector. The manual:
PostgreSQL's statistics collector is a subsystem that supports
collection and reporting of information about server activity. [...]
It can also count calls to user-defined functions and the total time
spent in each one.
[...]
The parameter track_functions
enables tracking of usage of
user-defined functions.
Bold emphasis mine.
track_functions (enum)
Enables tracking of function call counts and time used. Specify pl
to track only procedural-language functions, all
to also track SQL and
C language functions. The default is none
, which disables function
statistics tracking. Only superusers can change this setting.
Note: SQL-language functions that are simple enough to be "inlined" into the calling query will not be tracked, regardless of this setting.
So this is off by default. If all relevant functions are LANGUAGE plpgsql
, it's enough to set it to pl
in postgresql.conf
and reload. No need to restart the server for this setting.
track_functions = pl
Reload with pg_ctl reload
. Or on a typical Debian(-related) installation:
sudo -u postgres pg_ctlcluster 12 main reload
Postgres starts to gather information. After an adequate period of time, check track records. Careful though, some important functions may not be called in weeks. Your call ...
How to access gathered statistics? The manual again:
When statistics collection is enabled, the data that is produced can
be accessed via the pg_stat
and pg_statio
family of system views.
Refer to Chapter 27 for more information.
Basically:
SELECT * FROM pg_stat_user_functions;
Or you can easily look it up with pgAdmin (or another GUI). In pgAdmin (3 or 4), select the function and look at the "Statistics" tab top right: "Number of Calls".
Aside:
There are no true "stored procedures" before Postgres 11, just functions. The term "procedure" is often used synonymously.