Hi, On Sat, Jun 03, 2023 at 12:48:37PM +0530, Satalabaha Postgres wrote: > Hi Listers, > > We would like to determine how long it takes for each SQL statement to > execute within a long-running procedure. I tried to see if > pg_stat_statements could offer any insight into the matter. But I was > unable to locate any. Is this even possible? pg_stat_statements can tell you about queries executed inside a procedure, as long as you set pg_stat_statements.track = 'all': rjuju=# select pg_stat_statements_reset(); pg_stat_statements_reset -------------------------- (1 row) rjuju=# set pg_stat_statements.track = 'all'; SET rjuju=# do $$ begin perform count(*) from pg_class; perform pg_sleep(2); end; $$ language plpgsql; DO rjuju=# select query, total_exec_time from pg_stat_statements; query | total_exec_time --------------------------------------+--------------------- SELECT count(*) from pg_class | 0.13941699999999999 do +| 2001.903792 $$ +| begin +| perform count(*) from pg_class; +| perform pg_sleep(2); +| end; +| $$ language plpgsql | SELECT pg_sleep($1) | 2000.227249 [...] If that's not enough, and if your procedures are written in plpgsql you could also look at plpgsql_check: https://github.com/okbob/plpgsql_check. It has an integrated profiler (see https://github.com/okbob/plpgsql_check#profiler) that works very well. > unable to locate any. Is this even possible? How can we also determine the > precise SQL execution plan used when a SQL is run from an application? The > query runs without issue when we try to execute it directly, but it takes > longer to run when an application is used. You could look at auto_explain for that: https://www.postgresql.org/docs/current/auto-explain.html.