Re: unreliable behaviour of track_functions

From: Adrian Klaver <adrian(dot)klaver(at)aklaver(dot)com>
To: pinker <pinker(at)onet(dot)eu>, pgsql-general(at)postgresql(dot)org
Subject: Re: unreliable behaviour of track_functions
Date: 2018-04-01 16:29:16
Message-ID: 370eb893-48e8-8fa2-9ecf-c3e77e74cdc1@aklaver.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On 04/01/2018 06:02 AM, pinker wrote:
> I mean this part describing track_function:
>
> https://www.postgresql.org/docs/10/static/runtime-config-statistics.html
>
> 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.
>
> Only case described here, that exclude function from being tracked it's
> inlining, not the time and not the place in the query.

The below might help:

https://wiki.postgresql.org/wiki/Inlining_of_SQL_functions

In particular for your second case(place in query):

" Table functions

A table function call is any instance where func(args) appears where a
table is expected. (This is, for most functions, a PostgreSQL extension
to the SQL standard.) For example:

select * from func(123);
"

For your first case:

Inlining conditions for scalar functions

"the function body consists of a single, simple, SELECT expression"

So from your OP:

CREATE FUNCTION a(a bigint)
RETURNS bigint
STABLE
LANGUAGE SQL
AS $$
SELECT $1
$$;

If you change to:

CREATE FUNCTION a(a bigint)
RETURNS bigint
STABLE
LANGUAGE SQL
AS $$
SELECT 'test';
SELECT $1
$$;

then before change:

test=> select * from pg_stat_user_functions ;
funcid | schemaname | funcname | calls | total_time | self_time
---------+------------+----------+-------+------------+-----------
1386647 | public | a | 2 | 1251.598 | 1251.598
(1 row)

after change:

test=> select * from pg_stat_user_functions ;
funcid | schemaname | funcname | calls | total_time | self_time
---------+------------+----------+-------+------------+-----------
1386647 | public | a | 3 | 1251.682 | 1251.682

> So I would expect that pg_stat_user_function will show me that my function
> was executed. Good that are other ways to do it, but changing
> track_functions to 'all' I would expect all calls will be tracked...
>
>
>
> --
> Sent from: http://www.postgresql-archive.org/PostgreSQL-general-f1843780.html
>
>

--
Adrian Klaver
adrian(dot)klaver(at)aklaver(dot)com

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Jakub Janeček 2018-04-01 18:26:51 PostgreSQL Cascade streaming replication problem
Previous Message Adrian Klaver 2018-04-01 14:57:02 Re: Please suggest the best suited unit test frame work for postgresql database.