Thread: IMMUTABLE function's flag do not work: 7.3.4, plpgsql
Hi folks. I notice that immutable flag does nothing when i invoke my plpgsql function within one session with same args. tele=# SELECT version(); version ------------------------------------------------------------- PostgreSQL 7.3.4 on i686-pc-linux-gnu, compiled by GCC 2.96 At first EXPLAIN ANALYZE shown strange runtime :) [15:41]/0:ant@monstr:~>time psql -c 'EXPLAIN ANALYZE SELECT calc_total(1466476, 1062363600, 1064955599)' tele QUERY PLAN ---------------------------------------------------------------------------------- Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.00..0.00 rows=1 loops=1) Total runtime: 0.02 msec ^^^^^^^^^ (2 rows) real 0m19.282s ^^^^^^^^^ At second. calc_total() is immutable function: tele=# SELECT provolatile from pg_proc where proname = 'calc_total' and pronargs =3; provolatile ------------- i but it seems that it's not cached in one session: [15:38]/0:ant@monstr:~>psql tele Welcome to psql 7.3.4, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit tele=# EXPLAIN ANALYZE SELECT calc_total(1466476, 1062363600, 1064955599); QUERY PLAN ---------------------------------------------------------------------------------- Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.00..0.00 rows=1 loops=1) Total runtime: 0.02 msec (2 rows) tele=# EXPLAIN ANALYZE SELECT calc_total(1466476, 1062363600, 1064955599); QUERY PLAN ---------------------------------------------------------------------------------- Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.00..0.00 rows=1 loops=1) Total runtime: 0.02 msec (2 rows) What i miss? Thanks, Andriy Tkachuk http://www.imt.com.ua
Andriy Tkachuk <ant@imt.com.ua> writes: > At second. calc_total() is immutable function: > but it seems that it's not cached in one session: It's not supposed to be. The reason the "runtime" is small in your example is that the planner executes the function call while preparing the plan, and this isn't counted in EXPLAIN's runtime measurement. There's no claim anywhere that the results of such an evaluation would be saved for other plans. regards, tom lane
On Wed, 8 Oct 2003, Tom Lane wrote: > Andriy Tkachuk <ant@imt.com.ua> writes: > > At second. calc_total() is immutable function: > > but it seems that it's not cached in one session: > > It's not supposed to be. but it's written id doc: IMMUTABLE indicates that the function always returns the same result when given the same argument values; that is, it does not do database lookups or otherwise use information not directly present in its parameter list. If this option is given, any call of the function with all-constant arguments can be immediately replaced with the function value. I meant that the result of calc_total() is not "immediately replaced with the function value" as it's written in doc, but it takes as long time as the first function call in the session (with the same arguments). Maybe i misunderstand something? Thank you, Andriy Tkachuk. http://www.imt.com.ua
Andriy Tkachuk wrote: > On Wed, 8 Oct 2003, Tom Lane wrote: > > >>Andriy Tkachuk <ant@imt.com.ua> writes: >> >>>At second. calc_total() is immutable function: >>>but it seems that it's not cached in one session: >> >>It's not supposed to be. > > > but it's written id doc: > > IMMUTABLE indicates that the function always returns the same > result when given the same argument values; that is, it does not > do database lookups or otherwise use information not directly > present in its parameter list. If this option is given, any call > of the function with all-constant arguments can be immediately > replaced with the function value. The doc say "can be" not must and will be. Regards Gaetano Mendola
On Thu, 9 Oct 2003, Gaetano Mendola wrote: > Andriy Tkachuk wrote: > > On Wed, 8 Oct 2003, Tom Lane wrote: > > > > > >>Andriy Tkachuk <ant@imt.com.ua> writes: > >> > >>>At second. calc_total() is immutable function: > >>>but it seems that it's not cached in one session: > >> > >>It's not supposed to be. > > > > > > but it's written id doc: > > > > IMMUTABLE indicates that the function always returns the same > > result when given the same argument values; that is, it does not > > do database lookups or otherwise use information not directly > > present in its parameter list. If this option is given, any call > > of the function with all-constant arguments can be immediately > > replaced with the function value. > > The doc say "can be" not must and will be. ok, but on what it depends on? thanks, andriy http://www.imt.com.ua
Andriy Tkachuk wrote: > On Thu, 9 Oct 2003, Gaetano Mendola wrote: >>Andriy Tkachuk wrote: >>>On Wed, 8 Oct 2003, Tom Lane wrote: >>>>Andriy Tkachuk <ant@imt.com.ua> writes: >>>>>At second. calc_total() is immutable function: >>>>>but it seems that it's not cached in one session: >>>> >>>>It's not supposed to be. >>> >>> >>>but it's written id doc: >>> >>> IMMUTABLE indicates that the function always returns the same >>> result when given the same argument values; that is, it does not >>> do database lookups or otherwise use information not directly >>> present in its parameter list. If this option is given, any call >>> of the function with all-constant arguments can be immediately >>> replaced with the function value. >> >>The doc say "can be" not must and will be. > > > ok, but on what it depends on? For example in: select * from T where f_immutable ( 4 ) = T.id; in this case f_immutable will be evaluated once. select * from T where f_immutable ( T.id ) = X; here f_immutable will be avaluated for each different T.id. Regards Gaetano Mendola
Oh, Gaetano, didn't you see in my first letter of this topic that args are the same in session (they are constant)? The first paragraf of my first letter of this topic was: < Hi folks. I notice that immutable flag does nothing when i invoke < my plpgsql function within one session with same args. ^^^^^^^^^^^^^^ ... ok, mabe i should say "constant args" as in doc. Anyway, thank you for attention and willing to help. regards, andriy tkachuk (http://imt.com.ua) On Sun, 12 Oct 2003, Gaetano Mendola wrote: > Andriy Tkachuk wrote: > > > On Thu, 9 Oct 2003, Gaetano Mendola wrote: > >>Andriy Tkachuk wrote: > >>>On Wed, 8 Oct 2003, Tom Lane wrote: > >>>>Andriy Tkachuk <ant@imt.com.ua> writes: > >>>>>At second. calc_total() is immutable function: > >>>>>but it seems that it's not cached in one session: > >>>> > >>>>It's not supposed to be. > >>> > >>> > >>>but it's written id doc: > >>> > >>> IMMUTABLE indicates that the function always returns the same > >>> result when given the same argument values; that is, it does not > >>> do database lookups or otherwise use information not directly > >>> present in its parameter list. If this option is given, any call > >>> of the function with all-constant arguments can be immediately > >>> replaced with the function value. > >> > >>The doc say "can be" not must and will be. > > > > > > ok, but on what it depends on? > > For example in: > > select * from T where f_immutable ( 4 ) = T.id; > > > in this case f_immutable will be evaluated once. > > > > select * from T where f_immutable ( T.id ) = X; > > here f_immutable will be avaluated for each different T.id. > > Regards > Gaetano Mendola