On 19.12.2017 11:36, Pavel Stehule wrote:
> Hi
>
> 2017-12-19 12:28 GMT+01:00 Андрей Жиденков <pensna...@gmail.com
> <mailto:pensna...@gmail.com>>:
>
>     Few day ago a faced a problem: Pl/PgSQL procedure works slower
>     when running in parallel threads. I found the correlation between
>     number of assignments in procedure code and performance. I decided
>     to write the simple benchmark procedures and perform some test on
>     PostgreSQL 9.6.5 database installed on the server with 20 CPU
>     cores (2 Xeon E5-2690V2 CPUs).
>
>     This benchmark showed me that a simple Pl/PgSQL procedure with a
>     simple loop inside works slower when running even in 2 threads.
>     There is a procedure:
>
>     CREATE OR REPLACE FUNCTION benchmark_test() RETURNS VOID AS $$
>     DECLARE
>       v INTEGER; i INTEGER;
>     BEGIN
>       for i in 1..1000 loop
>         v := 1;
>       end loop;
>     END;
>     $$ LANGUAGE plpgsql;
>
>     What is the point? I know, that Pl/PgSQL performs a SELECT query
>     to calculate each value for assignment but I didn't expect that it
>     produce side effects like this. If there is some buffer lock or
>     anything else?
>
>
> I am little bit lost when you are speaking about threads. Postgres
> doesn't use it.
>
> your test is not correct - benchmark_test should be marked as immutable.

Would marking it IMMUTABLE not cache the result and thus bypass the
actual testing ?

> What will be result?
>
> Regards
>
> Pavel
>
>
>  
>
>
>     I've been written a post with charts and detailed explanation to
>     display these side
>     effects: 
> http://telegra.ph/Notes-about-PlPgSQL-assignment-performance-12-19
>     <http://telegra.ph/Notes-about-PlPgSQL-assignment-performance-12-19>
>
>     Any help would be greatly appreciated.
>     -- 
>
>

-- 
Hannu Krosing
PostgreSQL Consultant
Performance, Scalability and High Availability
https://2ndquadrant.com/

Reply via email to