pá 13. 9. 2019 v 9:09 odesílatel Konstantin Knizhnik < k.knizh...@postgrespro.ru> napsal:
> > > On 24.08.2019 19:13, Pavel Stehule wrote: > > > > so 24. 8. 2019 v 18:01 odesílatel David Fetter <da...@fetter.org> napsal: > >> On Fri, Aug 23, 2019 at 11:10:28AM +0200, Pavel Stehule wrote: >> > pá 23. 8. 2019 v 11:05 odesílatel Konstantin Knizhnik < >> > k.knizh...@postgrespro.ru> napsal: >> > >> > > >> > > >> > > On 22.08.2019 18:56, Pavel Stehule wrote: >> > > >> > > >> > > >> > > čt 22. 8. 2019 v 17:51 odesílatel Konstantin Knizhnik < >> > > k.knizh...@postgrespro.ru> napsal: >> > > >> > >> Some more information... >> > >> First of all I found out that marking PL/pgSQL function as immutable >> > >> significantly increase speed of its execution: >> > >> 19808 ms vs. 27594. It happens because exec_eval_simple_expr is taken >> > >> snapshot if function is volatile (default). >> > >> I wonder if PL/pgSQL compiler can detect that evaluated expression >> itself >> > >> is actually immutable and there is no need to take snapshot >> > >> for each invocation of this function. Also I have tried yet another >> PL >> > >> language - JavaScript, which is now new outsider, despite to the >> fact that >> > >> v8 JIT compiler is very good. >> > >> >> > > >> > > I have a plan to do some work in this direction. Snapshot is not >> necessary >> > > for almost buildin functions. If expr calls only buildin functions, >> then >> > > probably can be called without snapshot and without any work with plan >> > > cache. >> > > >> > > >> > > I wonder if the following simple patch is correct? >> > > >> > >> > You cannot to believe to user defined functions so immutable flag is >> > correct. Only buildin functions are 100% correct. >> > >> > CREATE OR REPLACE FUNCTION foo() >> > RETURNS int AS $$ >> > SELECT count(*) FROM pg_class; >> > $$ LANGUAGE sql IMMUTABLE; >> > >> > is working. >> >> No, it's lying to the RDBMS, so it's pilot error. The problem of >> determining from the function itself whether it is in fact immutable >> is, in general, equivalent to the Halting Problem, so no, we can't >> figure it out. We do need to trust our users not to lie to us, and we >> do not need to protect them from the consequences when they do. >> > > I have not any problem with fixing this behave when there will be any > alternative. > > I can imagine new special flag that can be used for STABLE functions, that > enforce one shot plans and can be optimized similar like IMMUTABLE > functions now - using result in planning time. > > The users lie because they must - there is not a alternative. There is not > any other solution - and estimation errors related to a joins are > fundamental issue. > > > Pavel, I wonder if I can put my patch (with fix which performs this > optimization only for built-in functions) to commitfest or you prefer to do > it yourself in some other way and propose your own solution? > I think so your patch is good enough for commitfest. It doesn't remove all overhead - I think so there is lot of overhead related to plan cache, but it in good direction. Probably for these expressions is our final target using a cached JIT - but nobody knows when it will be. I'll not have to time for my experiments before October. > > > Konstantin Knizhnik > Postgres Professional: http://www.postgrespro.com > The Russian Postgres Company > >