{"id":345693,"date":"2023-02-20T15:01:52","date_gmt":"2023-02-20T15:01:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=345693"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=345693","title":{"rendered":"<span>PostgreSQL 16: \u0427\u0430\u0441\u0442\u044c 4 \u0438\u043b\u0438 \u041a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442 2023-01<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043d\u043e\u0432\u0438\u043d\u043a\u0430\u043c\u0438 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0435\u0432\u0440\u0430\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442. \u0427\u0442\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u0432\u043f\u0435\u0440\u0435\u0434\u0438?<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0441\u0435\u0440\u0438\u0438: <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/681164\/\">2022-07<\/a>,<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/697228\/\"> 2022-09<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/706098\/\">2022-11<\/a>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0442 \u043e\u0431\u0437\u043e\u0440 \u043f\u043e\u043f\u0430\u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438:<\/p>\n<p>  <\/p>\n<p><a href=\"#commit_38d81760\">\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f random_normal<\/a><br \/>  <a href=\"#commit_6fcda9ab\">\u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043b\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/a><br \/>  <a href=\"#commit_81266442\">\u041f\u0440\u043e\u0449\u0430\u0439 postmaster<\/a><br \/>  <a href=\"#commit_16fd03e9\">\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 string_agg \u0438 array_agg<\/a><br \/>  <a href=\"#commit_4a29eabd\">\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 enable_presorted_aggregate<\/a><br \/>  <a href=\"#commit_ed1a88dd\">\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0434\u043b\u044f \u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/a><br \/>  <a href=\"#commit_8d83a5d0\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 GROUP BY \u0438 DISTINCT<\/a><br \/>  <a href=\"#commit_a46a7011\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b VACUUM: SKIP_DATABASE_STATS \u0438 ONLY_DATABASE_STATS<\/a><br \/>  <a href=\"#commit_5f53b42c\">pg_dump: \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438<\/a><br \/>  <a href=\"#commit_d747dc85\">PL\/pgSQL: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/a><br \/>  <a href=\"#commit_cf5eb37c\">\u0420\u043e\u043b\u0438 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c CREATEROLE<\/a><br \/>  <a href=\"#commit_096dd80f\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/a><br \/>  <a href=\"#commit_6e2775e4\">\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440: reserved_connections<\/a><br \/>  <a href=\"#commit_8ad51b5f\">postgres_fdw: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 TABLESAMPLE \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c<\/a><br \/>  <a href=\"#commit_594f8d37\">postgres_fdw: \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u044e\u0447\u0430 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><br \/>  <a href=\"#commit_efb6f4a4\">pg_ident.conf: \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f PostgreSQL<\/a><br \/>  <a href=\"#commit_3db72ebc\">\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DDL \u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434<\/a><br \/>  <a href=\"#commit_1fd3dd20\">\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f bt_multi_page_stats<\/a><br \/>  <a href=\"#commit_cca18634\">\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f pg_split_walfile_name<\/a><br \/>  <a href=\"#commit_c31cf1c0\">pg_walinspect, pg_waldump: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438\u0437 WAL<\/a><\/p>\n<p>  <a name=\"commit_38d81760\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4056\/\">\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f random_normal<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/38d81760\">38d81760<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438 random, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 0\u2026 1, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%BE%D1%80%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\">\u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445<\/a> \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b: random_normal. \u0423 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c 1 000 000 \u0447\u0438\u0441\u0435\u043b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0435 \u043a\u0430\u043a <a href=\"https:\/\/en.wikipedia.org\/wiki\/68%E2%80%9395%E2%80%9399.7_rule\">68-95-99.7<\/a>. \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 68% \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440) \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 \u043e\u0434\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 (\u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440) \u043a\u0430\u043a \u0432 \u043f\u043b\u044e\u0441, \u0442\u0430\u043a \u0438 \u0432 \u043c\u0438\u043d\u0443\u0441, 95% \u2015 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 2 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u044f \u0438 99.7% \u2015 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 3.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">WITH samples AS (     SELECT random_normal(0.0, 1.0) AS x FROM generate_series(1,1000000) ) SELECT count(x) FILTER (WHERE x BETWEEN -1 AND 1)\/1000000.0 AS stddev_1,        count(x) FILTER (WHERE x BETWEEN -2 AND 2)\/1000000.0 AS stddev_2,        count(x) FILTER (WHERE x BETWEEN -3 AND 3)\/1000000.0 AS stddev_3 FROM samples;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">        stddev_1        |        stddev_2        |        stddev_3         ------------------------+------------------------+------------------------  0.68391100000000000000 | 0.95473800000000000000 | 0.99724900000000000000<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 psql \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0435 gnuplot:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">WITH samples AS (     SELECT random_normal(0.0, 1.0) AS x FROM generate_series(1,1000000) ) SELECT round(x::numeric,1) point, count(*) AS density FROM samples GROUP BY point ORDER BY point \\g (format=unaligned tuples_only=on fieldsep='\\t') | gnuplot -e \"set term png; set output 'data.png'; plot '&lt;cat'\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u0448\u0430\u0433\u043e\u043c 0.1. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435 data.png \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u043a \u0432 \u0444\u043e\u0440\u043c\u0435 \u043a\u043e\u043b\u043e\u043a\u043e\u043b\u0430:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zz\/jq\/gi\/zzjqgicd70nbxspwioqyzsrnwqc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/zz\/jq\/gi\/zzjqgicd70nbxspwioqyzsrnwqc.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/tablefunc.html\">tablefunc<\/a> \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f normal_rand \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.depesz.com\/2023\/01\/11\/waiting-for-postgresql-16-invent-random_normal-to-provide-normally-distributed-random-numbers\/\">Waiting for PostgreSQL 16 \u2013 Invent random_normal() to provide normally-distributed random numbers<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<\/p>\n<p>  <a name=\"commit_6fcda9ab\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/3292\/\">\u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u0434\u043b\u044f \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/6fcda9ab\">6fcda9ab<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/6dfacbf7\">6dfacbf7<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/faff8f8e\">faff8f8e<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 SQL, \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u043c, \u043d\u043e \u0438 \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c, \u0432\u043e\u0441\u044c\u043c\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT 0x2A hex_int, 0o52 oct_int, 0b101010 bin_int;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> hex_int | oct_int | bin_int ---------+---------+---------       42 |      42 |      42<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 bigint, \u0442\u043e \u043e\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u0432 numeric (\u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442). \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0433\u0440\u0443\u043f\u043f \u0446\u0438\u0444\u0440 (\u0442\u0440\u0435\u0442\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442):<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT count(*) FROM generate_series(1, 1_000_000);<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  count   ---------  1000000<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.depesz.com\/2022\/12\/14\/waiting-for-postgresql-16-non-decimal-integer-literals\/\">Waiting for PostgreSQL 16 \u2013 Non-decimal integer literals<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<br \/>  <a href=\"https:\/\/www.depesz.com\/2023\/02\/06\/waiting-for-postgresql-16-allow-underscores-in-integer-and-numeric-constants\/\">Waiting for PostgreSQL 16 \u2013 Allow underscores in integer and numeric constants<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<br \/>  <a href=\"https:\/\/www.cybertec-postgresql.com\/en\/hex-oct-bin-integers-in-postgresql-16\/\">hex, oct, bin integers in PostgreSQL 16<\/a> (Pavlo Golub)<\/p>\n<p>  <a name=\"commit_81266442\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4030\/\">\u041f\u0440\u043e\u0449\u0430\u0439 postmaster<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/81266442\">81266442<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/37e26733\">37e26733<\/a><\/p>\n<p>  <\/p>\n<p>\u00ab\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 postmaster&#8230;\u00bb <\/p>\n<p>  <\/p>\n<p>\u0421 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u0444\u0440\u0430\u0437\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u0438\u0435 \u0443\u0447\u0435\u0431\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 PostgreSQL. \u041d\u043e \u0438\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 postmaster \u0443\u0436\u0435 15 \u043b\u0435\u0442 \u043a\u0430\u043a \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043c, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u2015 postgres. \u0423\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043e postmaster \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0430 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 bin \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b postmaster \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 postgres.<\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0449\u0430\u0442\u044c\u0441\u044f \u0441 postmaster. \u0412\u0441\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u043e \u043d\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u044b.<\/p>\n<p>  <a name=\"commit_16fd03e9\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/3794\/\">\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 string_agg \u0438 array_agg<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/16fd03e9\">16fd03e9<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u043e 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 string_agg \u0438 array_agg \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15=# EXPLAIN (costs off) SELECT fare_conditions, array_agg(flight_id), string_agg(ticket_no, ',') FROM ticket_flights GROUP BY fare_conditions;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">            QUERY PLAN             ----------------------------------  HashAggregate    Group Key: fare_conditions    ->  Seq Scan on ticket_flights<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u0430\u043d:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# EXPLAIN (costs off) SELECT fare_conditions, array_agg(flight_id), string_agg(ticket_no, ',') FROM ticket_flights GROUP BY fare_conditions;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                         QUERY PLAN                           -------------------------------------------------------------  Finalize GroupAggregate    Group Key: fare_conditions    ->  Gather Merge          Workers Planned: 2          ->  Sort                Sort Key: fare_conditions                ->  Partial HashAggregate                      Group Key: fare_conditions                      ->  Parallel Seq Scan on ticket_flights<\/code><\/pre>\n<p>  <a name=\"commit_4a29eabd\"><\/a>  <\/p>\n<p><strong>\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 enable_presorted_aggregate<\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/4a29eabd\">4a29eabd<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/3226f472\">3226f472<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 \u043e\u0446\u0435\u043d\u043a\u0443 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0447\u0430\u0449\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/697228\/#commit_1349d279\">\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441 ORDER BY \u0438 DISTINCT<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0432 <a href=\"https:\/\/www.postgresql.org\/message-id\/CAApHDvr1Sm+g9hbv4REOVuvQKeDWXcKUAhmbK5K+dfun0s9CvA@mail.gmail.com\">\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445<\/a> \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0433\u0440\u0443\u043f\u043f\u0430\u0445 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b \u0441 ORDER BY \u0438\u043b\u0438 DISTINCT \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438. \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <em>enable_presorted_aggregate<\/em> (\u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442) \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u043b\u0430\u043d \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439.<\/p>\n<p>  <a name=\"commit_ed1a88dd\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/3994\/\">\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u0434\u043b\u044f \u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/ed1a88dd\">ed1a88dd<\/a><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u043e\u043a\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u043c\u043a\u0430 \u043e\u043a\u043d\u0430 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u0430 \u044f\u0432\u043d\u043e, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <em>RANGE<\/em> UNBOUNDED PRECEDING. <\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15=# EXPLAIN (costs off, analyze, timing off) SELECT row_number() OVER (ORDER BY ticket_no) FROM tickets;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                    QUERY PLAN                                      -----------------------------------------------------------------------------------  WindowAgg (actual rows=2949857 loops=1)    ->  Index Only Scan using tickets_pkey on tickets (actual rows=2949857 loops=1)          Heap Fetches: 0  Planning Time: 0.098 ms  Execution Time: 682.466 ms<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u043c\u043a\u0438 <em>ROWS<\/em> UNBOUNDED PRECEDING. \u041d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u044d\u0442\u043e \u043d\u0435 \u043e\u043a\u0430\u0436\u0435\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u044f, \u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15=# EXPLAIN (costs off, analyze, timing off) SELECT row_number() OVER (ORDER BY ticket_no ROWS UNBOUNDED PRECEDING) FROM tickets;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                    QUERY PLAN                                      -----------------------------------------------------------------------------------  WindowAgg (actual rows=2949857 loops=1)    ->  Index Only Scan using tickets_pkey on tickets (actual rows=2949857 loops=1)          Heap Fetches: 0  Planning Time: 0.100 ms  Execution Time: 483.560 ms<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0430\u043c\u043a\u0438 \u0441 RANGE \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0441 ROWS. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/xfunc-optimization.html\">\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430<\/a> \u0434\u043b\u044f \u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 row_number, rank, dense_rank, percent_rank, cume_dist \u0438 ntile. \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0440\u0430\u043c\u043a\u0438 \u043e\u043a\u043d\u0430.<\/p>\n<p>  <a name=\"commit_8d83a5d0\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4083\/\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 GROUP BY \u0438 DISTINCT<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/8d83a5d0\">8d83a5d0<\/a><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437 \u043d\u0438\u0445, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SET max_parallel_workers_per_gather = 0; SET jit = off;  15=# EXPLAIN (costs off, analyze) SELECT b.seat_no, s.seat_no FROM boarding_passes b      JOIN seats s ON b.seat_no = s.seat_no GROUP BY b.seat_no, s.seat_no;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                               QUERY PLAN                                                 ---------------------------------------------------------------------------------------------------------  Group (actual time=3537.559..10758.307 rows=461 loops=1)    Group Key: b.seat_no, s.seat_no ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u043b\u0430\u043d\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430 \u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043b\u0430\u043d\u0430 \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                                QUERY PLAN                                                  -----------------------------------------------------------------------------------------------------------  HashAggregate (actual time=8201.412..8201.440 rows=461 loops=1)    Group Key: b.seat_no ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 Group Key. \u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u0442\u043e\u043b\u0431\u0446\u0443, \u0438 \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u043b\u0430\u043d, \u0430 \u0432 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u043e\u0431\u043e\u0438\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0441 \u0431\u043e\u043b\u0435\u0435 \u0445\u0443\u0434\u0448\u0438\u043c \u043e\u0431\u0449\u0438\u043c \u043f\u043b\u0430\u043d\u043e\u043c (\u0432\u0438\u0434\u043d\u043e \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f). <\/p>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u043d\u0430 \u0434\u043b\u044f DISTINCT \u0441 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0443 \u043f\u043e \u0434\u0432\u0443\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 (1\u0421, \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 ORM) \u0442\u0430\u043a\u043e\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438 \u043e\u043d\u0438 \u0432\u044b\u0438\u0433\u0440\u0430\u044e\u0442 \u043e\u0442 \u044d\u0442\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  <a name=\"commit_a46a7011\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4087\/\">\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b VACUUM: SKIP_DATABASE_STATS \u0438 ONLY_DATABASE_STATS<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/a46a7011\">a46a7011<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 (pg_database.datfrozenxid) \u0438 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043c\u0443\u043b\u044c\u0442\u0438\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 (pg_database.datminmxid). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c pg_class \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 relfrozenxid \u0438 relminmxid. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0435 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435. \u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u2015 \u0442\u0435\u043c \u0434\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. <\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u044f\u0434 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434 VACUUM \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446, \u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u043e\u0442\u044f \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>  <\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 vaccumdb (\u0432 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0441 12-\u0439 \u043f\u043e 15-\u044e) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 VACUUM \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u043c\u043d\u043e\u0433\u043e (\u0442\u044b\u0441\u044f\u0447\u0438, \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0442\u044b\u0441\u044f\u0447), \u0442\u043e \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0434\u0435\u043b\u0430\u044e\u0442 \u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439. \u041d\u0435 \u0441\u043f\u0430\u0441\u0430\u0435\u0442 \u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 -j), \u0432\u0435\u0434\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/sql-vacuum.html\">VACUUM<\/a> \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0434\u0432\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>SKIP_DATABASE_STATS \u2015 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0435, \u043a\u0440\u043e\u043c\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li>ONLY_DATABASE_STATS \u2015 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c vaccumdb \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0447\u0438\u0441\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446 \u0431\u0435\u0437 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0430 \u043f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">VACUUM(ONLY_DATABASE_STATS)<\/code><\/pre>\n<p>  <a name=\"commit_5f53b42c\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4052\/\">pg_dump: \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/5f53b42c\">5f53b42c<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b pg_dump \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u043b\u044f \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 LOCK TABLE \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043d\u0438\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 ACCESS SHARE. \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e (\u0434\u0435\u0441\u044f\u0442\u043a\u0438, \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447) \u0438 pg_dump \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e, \u0442\u043e \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c pg_dump \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 LOCK TABLE, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. (\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u0438\u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u043b\u0430 100 000 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.)<\/p>\n<p>  <a name=\"commit_d747dc85\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4002\/\">PL\/pgSQL: \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/d747dc85\">d747dc85<\/a><\/p>\n<p>  <\/p>\n<p>\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u0410 \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u044b (refcursor) \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u041f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0434\u043b\u044f \u043d\u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15=# DO $$ DECLARE                                    c CURSOR FOR SELECT 1; -- \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a\u0443\u0440\u0441\u043e\u0440     rc refcursor; -- \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u043e\u0440 BEGIN     RAISE NOTICE 'c: %, rc: %', c, rc;     OPEN c;     OPEN rc FOR SELECT 2;     RAISE NOTICE 'c: %, rc: %', c, rc; END;$$;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  c: c, rc: &lt;NULL> NOTICE:  c: c, rc: &lt;unnamed portal 7> DO<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443 \u0438\u043c\u0435\u043d, \u0435\u0441\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043a\u043e\u0434\u0430 (\u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u0431\u0443\u0434\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u044b \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u0432\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0438\u043c\u044f \u0434\u043b\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE PROCEDURE proc_1() AS $$DECLARE     c CURSOR FOR SELECT 1; BEGIN     FOR r IN c LOOP         RAISE NOTICE 'r: %, c: %', r, c;     END LOOP; END;$$ LANGUAGE plpgsql;  CREATE PROCEDURE proc_2() AS $$DECLARE     c CURSOR FOR SELECT 2; BEGIN     FOR r IN c LOOP         RAISE NOTICE 'r: %, c: %', r, c;         CALL proc_1();     END LOOP; END;$$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0432\u044b\u0437\u043e\u0432 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15=# CALL proc_2();<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  r: (2), c: c ERROR:  cursor \"c\" already in use CONTEXT:  PL\/pgSQL function proc_1() line 4 at FOR over cursor SQL statement \"CALL proc_1()\" PL\/pgSQL function proc_2() line 6 at CALL<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u0432 \u0441\u0442\u0430\u043d\u0435\u0442 \u0442\u0430\u043a\u0438\u043c \u0436\u0435, \u043a\u0430\u043a \u0438 \u0443 \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445. \u041e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u0410 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f (\u0435\u0441\u043b\u0438 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0443\u0440\u0441\u043e\u0440\u0443 \u044f\u0432\u043d\u043e \u043d\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435). <\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# CALL proc_2();<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  r: (2), c: &lt;unnamed portal 1> NOTICE:  r: (1), c: &lt;unnamed portal 2> CALL<\/code><\/pre>\n<p>  <a name=\"commit_cf5eb37c\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4050\/\">\u0420\u043e\u043b\u0438 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c CREATEROLE<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/cf5eb37c\">cf5eb37c<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/f1358ca5\">f1358ca5<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/e5b8a4c0\">e5b8a4c0<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u044f\u043c\u0438 \u0431\u0435\u0437 \u043f\u0440\u0430\u0432 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0440\u043e\u043b\u044c c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c CREATEROLE. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 SUPERUSER \u0442\u0430\u043a\u0430\u044f \u0440\u043e\u043b\u044c \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442, \u0435\u0441\u043b\u0438 \u0441\u0430\u043c\u0430 \u0438\u043c \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0443 \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0442\u044c.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15-postgres=# CREATE ROLE admin LOGIN CREATEROLE;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15-postgres=# \\c - admin<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">You are now connected to database \"postgres\" as user \"admin\".<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15-admin=> CREATE ROLE bob LOGIN;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">15-admin=> GRANT pg_execute_server_program TO bob;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">GRANT ROLE<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0451. \u0422\u0435\u043f\u0435\u0440\u044c bob \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. <\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# CREATE ROLE admin LOGIN CREATEROLE;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# \\c - admin<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">You are now connected to database \"postgres\" as user \"admin\".<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> CREATE ROLE bob LOGIN;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> \\du<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                   List of roles  Role name |                         Attributes                         | Member of -----------+------------------------------------------------------------+-----------  admin     | Create role                                                | {bob}  bob       |                                                            | {}  postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u043e\u043b\u044c admin \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u0440\u043e\u043b\u044c bob \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u043e\u043b\u0438. \u041f\u0440\u0438\u0447\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (WITH ADMIN OPTION). \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u043e\u043b\u044c\u044e bob \u043c\u043e\u0433\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u043e\u043b\u044c \u0435\u0451 \u0441\u043e\u0437\u0434\u0430\u0432\u0448\u0430\u044f. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0440\u043e\u043b\u044c\u044e \u0438 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c CREATEROLE.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# CREATE ROLE admin2 LOGIN CREATEROLE;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# \\c - admin2<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">You are now connected to database \"postgres\" as user \"admin2\".<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin2=> ALTER ROLE bob CONNECTION LIMIT 1;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ERROR:  permission denied<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0430 CREATEROLE \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0440\u043e\u043b\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0432\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u0440\u043e\u043b\u0438 bob \u0432 pg_execute_server_program. <\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> GRANT pg_execute_server_program TO bob;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ERROR:  must have admin option on role \"pg_execute_server_program\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b GRANT \u0440\u043e\u043b\u044c admin \u0441\u0430\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 pg_execute_server_program \u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441 \u043e\u043f\u0446\u0438\u0435\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# GRANT pg_execute_server_program TO admin WITH ADMIN OPTION;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">GRANT ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> GRANT pg_execute_server_program TO bob;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">GRANT ROLE<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043d\u0446\u0438\u043f, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0435\u043c \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0448\u044c \u0441\u0430\u043c, \u0438 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435. \u042d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043c\u043e\u0436\u0435\u0442 \u043b\u0438 admin \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u043e\u043b\u044c bob?<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> SET ROLE bob;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ERROR:  permission denied to set role \"bob\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0435\u0442, \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f SET ROLE \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0432 \u0440\u043e\u043b\u044c \u0431\u044b\u043b\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/706098\/#commit_3d14e171\">\u043e\u043f\u0446\u0438\u044f SET<\/a>. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0435\u0451 \u043d\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> SELECT roleid::regrole, member::regrole, grantor::regrole,        admin_option, inherit_option, set_option FROM pg_auth_members WHERE roleid = 'bob'::regrole\\gx<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">-[ RECORD 1 ]--+--------- roleid         | bob member         | admin grantor        | postgres admin_option   | t inherit_option | f set_option     | f<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438\u0448\u044c \u043e\u043f\u0446\u0438\u044f ADMIN, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u043e\u043b\u044c\u044e. \u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f INHERIT \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u043e\u043b\u044c admin \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0438 \u0440\u043e\u043b\u0438 bob. \u0410 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f SET \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u043e\u043b\u0438 admin \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u043e\u043b\u044c bob.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435? \u0420\u043e\u043b\u044c admin \u043c\u043e\u0436\u0435\u0442 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u0432 \u0440\u043e\u043b\u044c bob \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043e\u043f\u0446\u0438\u044f\u043c\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> GRANT bob TO admin WITH INHERIT TRUE, SET TRUE;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">GRANT ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> SET ROLE bob;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">SET<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0440\u043e\u043b\u044c admin \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0440\u043e\u043b\u0438 \u0438 \u0435\u0439 \u043d\u0443\u0436\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043e\u043f\u0446\u0438\u0438 SET \u0438\/\u0438\u043b\u0438 INHERIT \u0432 \u043d\u0438\u0445, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <em>createrole_self_grant<\/em> (\u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442).<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> SET createrole_self_grant = 'INHERIT, SET';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">SET<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> CREATE ROLE alice LOGIN;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">CREATE ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> SELECT roleid::regrole, member::regrole, grantor::regrole,        admin_option, inherit_option, set_option FROM pg_auth_members WHERE roleid = 'alice'::regrole AND grantor = 'admin'::regrole\\gx<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">-[ RECORD 1 ]--+------ roleid         | alice member         | admin grantor        | admin admin_option   | f inherit_option | t set_option     | t<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443\u0436\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0447\u043b\u0435\u043d\u0441\u0442\u0432\u0430 \u0432 \u0440\u043e\u043b\u0438 alice \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b REPLICATION, BYPASSRLS \u0438 CREATEDB \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u043e\u043b\u044f\u043c \u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0440\u043e\u043b\u044c admin \u0441\u0430\u043c\u0430 \u0438\u043c\u0438 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# ALTER ROLE admin CREATEDB;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ALTER ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-postgres=# \\c - admin<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">You are now connected to database \"postgres\" as user \"admin\".<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> ALTER ROLE bob CREATEDB;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ALTER ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16-admin=> ALTER ROLE bob REPLICATION;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ERROR:  must have replication privilege to change replication attribute<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"http:\/\/rhaas.blogspot.com\/2023\/01\/surviving-without-superuser-coming-to.html\">Surviving Without A Superuser \u2014 Coming to v16<\/a> (Robert Haas)<\/p>\n<p>  <a name=\"commit_096dd80f\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4037\/\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/096dd80f\">096dd80f<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 <a href=\"https:\/\/postgrespro.ru\/education\/demodb\">\u0434\u0435\u043c\u043e-\u0431\u0430\u0437\u0435<\/a> \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u044f\u0437\u044b\u043a \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 bookings.lang. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f bob \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u0443\u044e \u0440\u043e\u043b\u044c \u0431\u0435\u0437 \u043f\u0440\u0430\u0432 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f bob \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u044f\u0437\u044b\u043a \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c en:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">postgres=# \\c demo bob<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">You are now connected to database \"demo\" as user \"bob\".<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">bob=> ALTER ROLE bob IN DATABASE demo SET bookings.lang = 'en';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ERROR:  permission denied to set parameter \"bookings.lang\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 ALTER ROLE|DATABASE\u2026 SET \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0430\u0432 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041a\u0441\u0442\u0430\u0442\u0438, \u0441 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435) <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/679264\/#commit_a0ffa885\">\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0434\u0430\u0442\u044c<\/a> \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 GRANT\u2026 ON PARAMETER. \u041d\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0440\u043e\u043b\u0438 \u0431\u0435\u0437 \u043f\u0440\u0430\u0432 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">bob=> ALTER ROLE bob IN DATABASE demo SET bookings.lang = 'en' USER SET;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ALTER ROLE<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">bob=> \\c demo bob<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">You are now connected to database \"demo\" as user \"bob\".<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">bob=> SHOW bookings.lang;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> bookings.lang ---------------  en<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 pg_db_role_setting \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \\drds:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">bob=> \\drds<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                     List of settings  Role | Database |           Settings           | User set ------+----------+------------------------------+----------  bob  | demo     | bookings.lang=en             | t       | demo     | search_path=bookings, public+| f       +       |          | bookings.lang=ru             | f<\/code><\/pre>\n<p>  <a name=\"commit_6e2775e4\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/www.postgresql.org\/message-id\/20230119194601.GA4105788@nathanxps13\">\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440: reserved_connections<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/6e2775e4\">6e2775e4<\/a><\/p>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <em>superuser_reserved_connections<\/em> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 3) \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (_max<em>connections<\/em>) \u0438 \u0443 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0440\u043e\u043b\u044f\u043c\u0438, \u0431\u0435\u0437 \u043f\u0440\u0430\u0432 \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041a\u0430\u043a \u0434\u043b\u044f \u043d\u0438\u0445 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0441\u043b\u043e\u0442\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f?<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em>reserved_connections<\/em> (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0) \u0438 \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0440\u043e\u043b\u044c pg_use_reserved_connections. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u0432 <em>reserved_connections<\/em> (\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430) \u0438 \u0440\u043e\u043b\u0438, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 pg_use_reserved_connections, \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.cybertec-postgresql.com\/en\/reserve-connections-in-postgresql-16\/\">Reserve connections for the pg_use_reserved_connections group in PostgreSQL 16<\/a> (Pavlo Golub)<\/p>\n<p>  <a name=\"commit_8ad51b5f\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/3535\/\">postgres_fdw: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 TABLESAMPLE \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/8ad51b5f\">8ad51b5f<\/a><\/p>\n<p>  <\/p>\n<p>\u0421\u0431\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 ANALYZE \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c, \u0442.\u043a. \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 (300 default_statistics_target*).<\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 TABLESAMPLE \u0434\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438. \u0410 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0445 TABLESAMPLE (\u0434\u043e 9.5), \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 random.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0431\u0430\u0437\u0435 postgres \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 tickets (~3 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u0442\u0440\u043e\u043a) \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 demo \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE EXTENSION postgres_fdw;  CREATE SERVER srv     FOREIGN DATA WRAPPER postgres_fdw     OPTIONS (dbname 'demo');  CREATE USER MAPPING FOR postgres     SERVER srv     OPTIONS (user 'postgres');  IMPORT FOREIGN SCHEMA bookings     LIMIT TO (tickets)     FROM SERVER srv     INTO public;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0435\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">\\timing on  ANALYZE tickets;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ANALYZE Time: 322,737 ms<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0432 \u0441\u0435\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0445\u043e\u0434\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u0441\u0431\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">ALTER FOREIGN TABLE tickets OPTIONS (analyze_sampling 'off');  ANALYZE tickets;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ANALYZE Time: 2068,078 ms (00:02,068)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u044d\u0442\u043e \u043f\u0440\u0438 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0431\u0435 \u0431\u0430\u0437\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0415\u0441\u043b\u0438 \u0431\u044b \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0431\u044b \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u0438 \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0431\u044b \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>  <a name=\"commit_594f8d37\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/2992\/\">postgres_fdw: \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u044e\u0447\u0430 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/594f8d37\">594f8d37<\/a><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 postgres_fdw <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/541252#commit_b663a413\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442<\/a> \u043f\u0430\u043a\u0435\u0442\u043d\u0443\u044e \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441 14-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/706098\/#commit_97da4824\">\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c<\/a> \u043e \u0441\u043d\u044f\u0442\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430 \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b COPY. \u041d\u043e \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. <\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 INSERT \u0438 COPY. \u041a\u0430\u043a \u0436\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438? \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c UPDATE \u043a\u043b\u044e\u0447\u0430 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0415\u0441\u043b\u0438 \u0441\u0435\u043a\u0446\u0438\u044f-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439, \u0442\u043e \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u043d\u0435\u0451 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u043d\u044f\u043b\u0438.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u041f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d.<\/p>\n<p>  <a name=\"commit_efb6f4a4\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4081\/\">pg_ident.conf: \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f PostgreSQL<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/efb6f4a4\">efb6f4a4<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u0444\u0430\u0439\u043b\u0435 pg_ident.conf \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f PostgreSQL (\u043f\u043e\u043b\u0435 PG-USERNAME) \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c, \u0447\u0442\u043e \u0438 \u0432 pg_hba.conf. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 all \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u044e\u0431\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e;<\/li>\n<li>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u00ab\/\u00bb, \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438;<\/li>\n<li>\u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u00ab+\u00bb, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0447\u043b\u0435\u043d\u0441\u0442\u0432\u043e \u0432 \u0440\u043e\u043b\u044f\u0445.<\/li>\n<\/ul>\n<p>  <a name=\"commit_3db72ebc\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4047\/\">\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DDL \u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/3db72ebc\">3db72ebc<\/a><\/p>\n<p>  <\/p>\n<p>\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (query jumbling) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0438 \u0445\u0435\u0448-\u043a\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 pg_stat_statements \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0412\u0430\u0436\u043d\u043e \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434 DML \u0445\u0435\u0448-\u043a\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u043d\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 \u0441\u043b\u043e\u0432, \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u043a\u0440\u043e\u043c\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 DML, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b DDL, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u0435\u0448-\u043a\u043e\u0434 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u043b\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0412 15-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0432\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 pg_stat_statements \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438, \u0445\u043e\u0442\u044f \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">DROP TABLE IF EXISTS t; drop   table   if   exists   t;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0442\u0447\u0443, \u0432 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f \u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u0432 pg_stat_statements:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT queryid, query, calls FROM pg_stat_statements WHERE query ILIKE 'drop table%';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">       queryid       |         query          | calls ---------------------+------------------------+-------  8953406224830875875 | DROP TABLE IF EXISTS t |     2<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043a\u0430 \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 CALL \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 SET.<\/p>\n<p>  <a name=\"commit_1fd3dd20\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4007\/\">\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f bt_multi_page_stats<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/1fd3dd20\">1fd3dd20<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0438 pageinspect \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f bt_multi_page_stats, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c Btree-\u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 bt_page_stats. \u0423 \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0442\u0440\u0435\u0442\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446. \u0415\u0441\u043b\u0438 \u043e\u043d \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT blkno, type, live_items FROM bt_multi_page_stats('pg_class_oid_index', 2, -1);<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> blkno | type | live_items -------+------+------------      2 | l    |        145      3 | r    |          2 (2 rows)<\/code><\/pre>\n<p>  <a name=\"commit_cca18634\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/3909\/\">\u041d\u043e\u0432\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f pg_split_walfile_name<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/cca18634\">cca18634<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/13e0d7a6\">13e0d7a6<\/a><\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 WAL-\u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u044e LSN, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e pg_split_walfile_name. <\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0444\u0430\u0439\u043b WAL \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 42 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT pg_walfile_name(pg_current_wal_lsn()) AS walfile,        42 AS offset \\gset<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f pg_split_walfile_name \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 WAL \u0438 \u043b\u0438\u043d\u0438\u044e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT :'walfile' AS walfile, * FROM pg_split_walfile_name(:'walfile');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">         walfile          | segment_number | timeline_id --------------------------+----------------+-------------  000000010000000100000040 |            320 |           1<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440, \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0432 LSN.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT :'walfile' AS walfile,                                                      :offset AS offset,        '0\/0'::pg_lsn + w.segment_number*s.setting::int + :offset AS lsn FROM pg_split_walfile_name(:'walfile') w, pg_settings s WHERE s.name = 'wal_segment_size';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">         walfile          | offset |    lsn      --------------------------+--------+------------  000000010000000100000040 |     42 | 1\/4000002A<\/code><\/pre>\n<p>  <a name=\"commit_c31cf1c0\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/41\/4084\/\">pg_walinspect<\/a>, <a href=\"https:\/\/commitfest.postgresql.org\/41\/3628\/\">pg_waldump<\/a>: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438\u0437 WAL<\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/c31cf1c0\">c31cf1c0<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/d497093c\">d497093c<\/a><\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u043f\u0440\u0435\u0434\u0437\u0430\u043f\u0438\u0441\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 WAL.<\/p>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0437\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 WAL \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438.\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 WAL \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b UPDATE.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE t AS SELECT x FROM generate_series(1,100) x; CHECKPOINT;  SELECT pg_current_wal_lsn() AS start_lsn;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> start_lsn   ------------  1\/6DF4D250<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">UPDATE t SET x = x + 1;  SELECT pg_current_wal_lsn() AS end_lsn;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  end_lsn    ------------  1\/6DF51A18<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 pg_get_wal_fpi_info \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f pg_walinspect (\u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 WAL \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c\u0438 LSN.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE EXTENSION pg_walinspect;  SELECT lsn, reltablespace, reldatabase, relfilenode, relblocknumber, forkname,        substr(fpi, 1, 8) AS fpi_trimmed FROM pg_get_wal_fpi_info('1\/6DF4D250', '1\/6DF51A18');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">    lsn     | reltablespace | reldatabase | relfilenode | relblocknumber | forkname |    fpi_trimmed      ------------+---------------+-------------+-------------+----------------+----------+--------------------  1\/6DF4D250 |          1663 |       16384 |        1259 |              1 | main     | \\x01000000002ef46d  1\/6DF4E9A8 |          1663 |       16384 |        1249 |             60 | main     | \\x01000000c0b6f46d  1\/6DF4EF58 |          1663 |       16384 |       16678 |              0 | main     | \\x0100000008d0f46d (3 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u044d\u0442\u0438 \u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 pg_waldump. \u0414\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 save-fullpage (\u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442) \u0443\u043a\u0430\u0436\u0435\u043c \u0438\u043c\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ pg_waldump --start=1\/6DF4D250 --end=1\/6DF51A18 --quiet --save-fullpage=.\/waldump $ ls -1 -s -h .\/waldump<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">total 24K 8,0K 00000001-6DF4D250.1663.16384.1259.1_main 8,0K 00000001-6DF4E9A8.1663.16384.1249.60_main 8,0K 00000001-6DF4EF58.1663.16384.16678.0_main<\/code><\/pre>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0451. \u0416\u0434\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0434\u043b\u044f 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <a href=\"https:\/\/commitfest.postgresql.org\/42\/\">\u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/718100\/\"> https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/718100\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043d\u043e\u0432\u0438\u043d\u043a\u0430\u043c\u0438 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438. \u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0435\u0432\u0440\u0430\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442. \u0427\u0442\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0441 \u0436\u0434\u0435\u0442 \u0432\u043f\u0435\u0440\u0435\u0434\u0438?<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0440\u0435\u0445 \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0441\u0435\u0440\u0438\u0438: <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/681164\/\">2022-07<\/a>,<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/697228\/\"> 2022-09<\/a>, <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/706098\/\">2022-11<\/a>.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-345693","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345693","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=345693"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/345693\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=345693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=345693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=345693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}