Hi just for curiosity - I tested simple script
postgres=# do $$ declare s bigint = 0; begin for i in 1..1000000000 loop s := s + i; end loop; raise notice '%', s; end; $$; to see a overhead of some components 5,72% plpgsql.so [.] exec_assign_value 5,59% postgres [.] GetSnapshotData 4,94% plpgsql.so [.] exec_eval_simple_expr 4,84% postgres [.] AllocSetAlloc 3,61% postgres [.] ResourceOwnerForgetPlanCacheRef 2,95% postgres [.] choose_custom_plan 2,94% postgres [.] GetUserId 2,92% postgres [.] GetCachedPlan 2,87% postgres [.] LWLockAttemptLock 2,85% postgres [.] memset@plt 2,76% postgres [.] LWLockRelease 2,70% postgres [.] AllocSetFree 2,42% plpgsql.so [.] assign_simple_var 2,36% postgres [.] ExecInterpExpr 2,35% postgres [.] PopActiveSnapshot 2,27% postgres [.] OverrideSearchPathMatchesCurrent 2,22% plpgsql.so [.] plpgsql_param_eval_var 2,21% plpgsql.so [.] exec_stmt 1,89% libc-2.27.so [.] __memset_sse2_unaligned_erms 1,75% postgres [.] PushActiveSnapshot 1,74% postgres [.] AcquireExecutorLocks 1,67% postgres [.] CopySnapshot 1,64% postgres [.] CheckCachedPlan 1,56% postgres [.] RevalidateCachedQuery 1,55% postgres [.] MemoryContextAlloc 1,53% postgres [.] pfree 1,50% postgres [.] ResourceArrayRemove 1,43% postgres [.] LWLockAcquire 1,40% postgres [.] SPI_plan_get_cached_plan Regards Pavel