I've digged into the source code a little bit and found that chain: PLPGSQL_STMT_ASSIGN -> exec_stmt_assign() -> exec_assign_expr() -> exec_eval_expr() -> exec_run_select() -> SPI_execute_plan_with_paramlist() -> _SPI_execute_plan() which finnaly calls PushActiveSnapshot() and PopActiveSnapshot() wich just do memory context allocations and use malloc() to copy snaphot.
Maybe I have missed something? On Tue, Dec 19, 2017 at 4:34 PM, Alvaro Herrera <alvhe...@alvh.no-ip.org> wrote: > Andrey Zhidenkov wrote: > > When I run this test in 2 threads I expect that running time will be the > > same, because PostgreSQL will fork process for the second connection and > > this process will be served by a separate CPU core because I have more > than > > 2 cores. > > Yes, IMMUTABLE flag helps, but I think It's just because Postgres > actually > > executes procedure only once. > > Just a guess without actually looking at the WaitEvents (which you > should do) is that this is blocking on snapshot acquisition or something > like that. > > -- > Álvaro Herrera https://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services > -- С уважением, Андрей Жиденков.