{"id":372242,"date":"2024-05-21T05:07:41","date_gmt":"2024-05-21T05:07:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=372242"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=372242","title":{"rendered":"<span>PostgreSQL 17: \u0427\u0430\u0441\u0442\u044c 4 \u0438\u043b\u0438 \u041a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442 2024-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><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/vh\/xc\/yn\/vhxcynazoiqklcuz8lkkm1icazc.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/vh\/xc\/yn\/vhxcynazoiqklcuz8lkkm1icazc.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u043d\u0430 \u0443\u0436\u0435 \u0432 \u0440\u0430\u0437\u0433\u0430\u0440\u0435, \u0430 \u043c\u044b \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u0438\u043c\u043d\u0435\u0433\u043e, \u044f\u043d\u0432\u0430\u0440\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430. \u0418 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043a\u043e\u0437\u044b\u0440\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438: <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/757028\/\">2023-07<\/a>, <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/769598\/\">2023-09<\/a>, <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/782042\/\">2023-11<\/a>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p><a href=\"#commit_174c4805\">\u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><br \/>  <a href=\"#commit_9a17be1e\">\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f: \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430-\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430<\/a><br \/>  <a href=\"#commit_8b2bcf3f\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438<\/a><br \/>  <a href=\"#commit_5de890e3\">EXPLAIN (memory): \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/a><br \/>  <a href=\"#commit_12915a58\">pg_stat_checkpointer: \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0442\u043e\u0447\u0435\u043a \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445<\/a><br \/>  <a href=\"#commit_b4375717\">\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 BRIN<\/a><br \/>  <a href=\"#commit_b262ad44\">\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c IS [NOT] NULL \u0434\u043b\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432<\/a><br \/>  <a href=\"#commit_ad57c2a7\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f SET search_path<\/a><br \/>  <a href=\"#commit_0452b461\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f GROUP BY<\/a><br \/>  <a href=\"#commit_075df6b2\">\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 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438<\/a><br \/>  <a href=\"#commit_5e8674dc\">PL\/pgSQL: \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 %TYPE \u0438 %ROWTYPE<\/a><br \/>  <a href=\"#commit_66ea94e8\">jsonpath: \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><br \/>  <a href=\"#commit_9e2d8701\">COPY\u2026 FROM: \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432<\/a><br \/>  <a href=\"#commit_8ba6fdf9\">to_timestamp: \u0444\u043e\u0440\u043c\u0430\u0442\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 TZ \u0438 OF<\/a><br \/>  <a href=\"#commit_69958631\">GENERATED AS IDENTITY \u0432 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445<\/a><br \/>  <a href=\"#commit_5d06e99a\">ALTER COLUMN\u2026 SET EXPRESSION<\/a><\/p>\n<p>  <a name=\"commit_174c4805\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4648\/\">\u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/174c4805\">174c4805<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/dc212340\">dc212340<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0442\u043e\u0447\u043a\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 WAL \u0434\u043e \u043d\u0443\u0436\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e: \u043a\u043e\u043f\u0438\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e, \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u044e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p>\u0412 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0434\u0443\u0442 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/continuous-archiving.html#BACKUP-INCREMENTAL-BACKUP\">\u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438<\/a>, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c walsummarizer \u2015 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u044e\u0449\u0438\u0439 WAL \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <em><a href=\"https:\/\/www.postgresql.org\/docs\/devel\/runtime-config-wal.html#GUC-SUMMARIZE-WAL\">summarize_wal<\/a><\/em>. \u0423\u0434\u043e\u0431\u043d\u043e, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u0422\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043d\u043e \u0438 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">ALTER SYSTEM SET summarize_wal = on; SELECT pg_reload_conf();<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 pg_stat_activity. \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 pg_wal\/summaries.<\/p>\n<p>  <\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ pg_basebackup -c fast -D backups\/full<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437\u043c\u0435\u043d\u0438\u043c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE tickets_copy AS SELECT * FROM tickets;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 -i \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ pg_basebackup -c fast -D backups\/increment1 \\     -i backups\/full\/backup_manifest<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">DELETE FROM tickets_copy;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438, \u0430 \u043d\u0435 \u043d\u0430 \u043f\u043e\u043b\u043d\u043e\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 -i \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ pg_basebackup -c fast -D backups\/increment2 \\     -i backups\/increment1\/backup_manifest<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 pg_combinebackup. \u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438, \u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 pg_combinebackup \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431\u0435 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0438 \u043f\u043e\u043b\u043d\u0443\u044e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0441\u0442\u043e, \u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u043b\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ pg_combinebackup backups\/full backups\/increment1 backups\/increment2 \\     -o backups\/full_combined <\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u043a\u043e\u043f\u0438\u0439. \u041a\u0430\u043a \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u043e\u043b\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ du -h -s backups\/*<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">2,7G    backups\/full 2,7G    backups\/full_combined 411M    backups\/increment1 25M     backups\/increment2<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437 \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u043b\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c \u043f\u043e\u0440\u0442\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ pg_ctl start -D backups\/full_combined \\     -o '-p 5400' \\     -l backups\/full_combined\/logfile<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ psql -p 5400 -c 'SELECT count(*) FROM tickets_copy'<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> count -------      0 (1 row)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u043c\u0438 \u043a\u043e\u043f\u0438\u044f\u043c\u0438 \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0431\u043e\u0440 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 walsummarizer, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <em><a href=\"https:\/\/www.postgresql.org\/docs\/devel\/runtime-config-wal.html#GUC-SUMMARIZE-WAL\">summarize_wal<\/a><\/em>.<\/li>\n<li>\u0414\u043b\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 walsummarizer, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 pg_wal\/summaries \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/app-pgwalsummary.html\">pg_walsummary<\/a> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 SQL pg_available_wal_summaries, pg_wal_summary_contents, pg_get_wal_summarizer_state.<\/li>\n<li>\u0412 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/protocol-replication.html\">\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 UPLOAD_MANIFEST, \u0430 \u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b BASE_BACKUP \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 INCREMENTAL.<\/li>\n<li>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/app-pgbasebackup.html\">pg_basebackup<\/a> \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 -i (&#8212;incremental). \u0421 \u044d\u0442\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c pg_basebackup \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438.<\/li>\n<li>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/www.postgresql.org\/docs\/devel\/app-pgcombinebackup.html\">pg_combinebackup<\/a> \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u043d\u0443\u044e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0438\u0437 \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u0438 \u0432\u0441\u0435\u0445 \u043a\u043e\u043f\u0438\u0439, \u043e\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"http:\/\/rhaas.blogspot.com\/2024\/01\/incremental-backup-what-to-copy.html\">Incremental Backup: What To Copy?<\/a> (Robert Haas)<br \/>  <a href=\"http:\/\/rhaas.blogspot.com\/2024\/01\/incremental-backups-evergreen-and-other.html\">Incremental Backups: Evergreen and Other Use Cases<\/a> (Robert Haas)<br \/>  <a href=\"https:\/\/pganalyze.com\/blog\/5mins-postgres-17-incremental-backups\">Waiting for Postgres 17: Incremental base backups<\/a> (Lukas Fittl)<br \/>  <a href=\"https:\/\/www.depesz.com\/2024\/01\/08\/waiting-for-postgresql-17-add-support-for-incremental-backup\/\">Waiting for PostgreSQL 17 \u2013 Add support for incremental backup.<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<\/p>\n<p>  <a name=\"commit_9a17be1e\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4199\/\">\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f: \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430-\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/9a17be1e\">9a17be1e<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u043e <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/782042\/#commit_29d0a77f\">\u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u0441\u043b\u043e\u0442\u043e\u0432 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a> \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0422\u0435\u043c\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430-\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>  <a name=\"commit_8b2bcf3f\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4684\/\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/8b2bcf3f\">8b2bcf3f<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/abb0b4fc\">abb0b4fc<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0445 \u0447\u0435\u0440\u0435\u0437 <em>shared_preload_libraries<\/em>, \u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0447\u0435\u0440\u0435\u0437 DSM API), \u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0433\u043b\u0438 \u0435\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u043d\u0430\u0442\u044c, \u0433\u0434\u0435 \u0435\u0435 \u0438\u0441\u043a\u0430\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0430\u0442\u0447: \u0432\u0435\u0434\u0435\u0442 \u0440\u0435\u0435\u0441\u0442\u0440 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0438\u0442).<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0442\u0430\u043b\u043e pg_prewarm (\u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442). \u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 autoprewarm_start_worker \u0438 autoprewarm_dump_now \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043e\u0442\u044a\u0435\u0434\u0430\u0435\u0442 \u043e\u0431\u0449\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0435\u0441\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 pg_prewarn \u043d\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  <a name=\"commit_5de890e3\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4492\/\">EXPLAIN (memory): \u043e\u0431\u044a\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/5de890e3\">5de890e3<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u043c\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043d\u043e \u0438 \u0434\u043b\u044f \u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u044b\u043b\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c memory \u043a\u043e\u043c\u0430\u043d\u0434\u044b EXPLAIN:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">EXPLAIN (memory, costs off) SELECT * FROM tickets;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                   QUERY PLAN                     -------------------------------------------------  Seq Scan on tickets  Planning:    Memory: used=7920 bytes  allocated=8192 bytes (3 rows)<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">EXPLAIN (memory, costs off) SELECT * FROM tickets a, tickets b;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                    QUERY PLAN                      ---------------------------------------------------  Nested Loop    ->  Seq Scan on tickets a    ->  Materialize          ->  Seq Scan on tickets b  Planning:    Memory: used=19392 bytes  allocated=65536 bytes (6 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0435, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u043b\u0430\u043d\u0430. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438.<\/p>\n<p>  <a name=\"commit_12915a58\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/3961\/\">pg_stat_checkpointer: \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0442\u043e\u0447\u0435\u043a \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0445<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/12915a58\">12915a58<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u043d\u043e\u0432\u043e\u0435 \u0434\u043b\u044f 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/782042\/#commit_96f05261\">pg_stat_checkpointer<\/a> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0442\u043e\u0447\u0435\u043a \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430: restartpoints_timed, restartpoints_req \u0438 restartpoints_done. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0447\u0435\u043a \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u043e\u0447\u043a\u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0430\u0449\u0435, \u0447\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u043d\u0430 \u0440\u0435\u043f\u043b\u0438\u043a\u0443 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u0430 \u0437\u0430\u043f\u0438\u0441\u044c WAL \u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438, \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0435 \u0442\u043e\u0447\u043a\u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0430 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e.<\/p>\n<p>  <a name=\"commit_b4375717\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4350\/\">\u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 BRIN<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/b4375717\">b4375717<\/a><\/p>\n<p>  <\/p>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441\u044b BRIN \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438. \u0420\u0430\u043d\u044c\u0448\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 B-\u0434\u0435\u0440\u0435\u0432\u0430.<\/p>\n<p>  <a name=\"commit_b262ad44\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4459\/\">\u0417\u0430\u043f\u0440\u043e\u0441\u044b \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c IS [NOT] NULL \u0434\u043b\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/b262ad44\">b262ad44<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b tickets \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0441\u0442\u043e\u043b\u0431\u0435\u0446 ticket_no \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# EXPLAIN (costs off) SELECT * FROM tickets WHERE ticket_no IS NOT NULL;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">            QUERY PLAN              -----------------------------------  Seq Scan on tickets    Filter: (ticket_no IS NOT NULL) (2 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0442\u043e\u043b\u0431\u0435\u0446 ticket_no \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 NOT NULL, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0442\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u0430\u0441\u043d\u043e. \u0415\u0449\u0435 \u0445\u0443\u0436\u0435, \u0435\u0441\u043b\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 IS NULL: \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 (\u0445\u043e\u0442\u044c \u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443), \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# EXPLAIN (costs off) SELECT * FROM tickets WHERE ticket_no IS NULL;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                QUERY PLAN                 ------------------------------------------  Index Scan using tickets_pkey on tickets    Index Cond: (ticket_no IS NULL) (2 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432 \u0437\u0430\u043f\u0440\u043e\u0441. \u041d\u043e \u0432\u0435\u0434\u044c \u043d\u0435\u0442 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0432 min\/max \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 IS NOT NULL \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u042d\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u043b\u043e\u0445\u043e\u043c\u0443 \u0432\u044b\u0431\u043e\u0440\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0435\u0441\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043b\u0430\u043d\u043e\u0432 \u0434\u043b\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0439 IS [NOT] NULL \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443 \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f NOT NULL:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">17=# EXPLAIN (costs off) SELECT * FROM bookings WHERE book_date IS NOT NULL;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">      QUERY PLAN       ----------------------  Seq Scan on bookings (1 row)<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">17=# EXPLAIN (costs off) SELECT * FROM tickets WHERE ticket_no IS NULL;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">        QUERY PLAN         --------------------------  Result    One-Time Filter: false (2 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e <code>NOT NULL<\/code>. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 <code>CHECK (column_name IS NOT NULL)<\/code> \u0445\u043e\u0442\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u0443 \u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>  <a name=\"commit_ad57c2a7\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4466\/\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f SET search_path<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/ad57c2a7\">ad57c2a7<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/a86c61c9\">a86c61c9<\/a><\/p>\n<p>  <\/p>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <em>search_path<\/em> \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0432 psql \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0437\u0430\u043c\u0435\u0440\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0435\u0437 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# CREATE FUNCTION f() RETURNS int AS 'SELECT 0' LANGUAGE SQL; 16=# \\timing on 16=# DO 'BEGIN PERFORM f() FROM generate_series(1, 10_000_000); END';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">DO Time: 1909,958 ms (00:01,910)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# ALTER FUNCTION f SET search_path = a,b,c; 16=# DO 'BEGIN PERFORM f() FROM generate_series(1, 10_000_000); END';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">DO Time: 12594,300 ms (00:12,594)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <em>search_path<\/em> \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">17=# DO 'BEGIN PERFORM f() FROM generate_series(1, 10_000_000); END';<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">DO Time: 9501,717 ms (00:09,502)<\/code><\/pre>\n<p>  <a name=\"commit_0452b461\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4562\/\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f GROUP BY<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/0452b461\">0452b461<\/a><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0435\u0449\u0435 \u0432 15-\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0435\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/679264\/#commit_db0d67db\">\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a> \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043e\u0431\u0437\u043e\u0440\u0435 \u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430 2022 \u0433\u043e\u0434\u0430. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u0441\u0430\u043c\u044b\u043c \u0432\u044b\u0445\u043e\u0434\u043e\u043c PostgreSQL 15 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e, \u0442\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445, \u0433\u0434\u0435 \u0432 GROUP BY \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043b\u0430\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438\u043b\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. \u041d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u044d\u0442\u043e \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0440\u0430\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/blog.anayrat.info\/en\/2024\/01\/26\/group-by-reordering\/\">GROUP BY reordering<\/a> (Adrien Nayrat)<\/p>\n<p>  <a name=\"commit_075df6b2\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4656\/\">\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 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/075df6b2\">075df6b2<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0439\u0441\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0435\u043c\u044c \u0434\u043d\u0435\u0439 \u0430\u0432\u0433\u0443\u0441\u0442\u0430 2018 \u0433\u043e\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">16=# EXPLAIN (costs off) SELECT * FROM flights WHERE actual_departure &lt;@ tstzrange('2017-08-01', '2017-08-08', '[)');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                            QUERY PLAN                                             --------------------------------------------------------------------------------------------------  Seq Scan on flights    Filter: (actual_departure &lt;@ '[\"2017-08-01 00:00:00+03\",\"2017-08-08 00:00:00+03\")'::tstzrange) (2 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0443 actual_departure \u0435\u0441\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441, \u043d\u043e \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c &lt;@ .<\/p>\n<p>  <\/p>\n<p>\u0412 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430\u043c\u0438 @> \u0438 &lt;@ \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \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, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043d\u0430 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u043e\u0431\u0435\u0438\u043c\u0438 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u043b\u0430\u043d \u044d\u0442\u043e\u0433\u043e \u0436\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">17=# EXPLAIN (costs off) SELECT * FROM flights WHERE actual_departure &lt;@ tstzrange('2017-08-01', '2017-08-08', '[)');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">                                                                              QUERY PLAN                                                                               ----------------------------------------------------------------------------------------------------------------------------------------------------------------------  Index Scan using flights_actual_departure_idx on flights    Index Cond: ((actual_departure >= '2017-08-01 00:00:00+03'::timestamp with time zone) AND (actual_departure &lt; '2017-08-08 00:00:00+03'::timestamp with time zone)) (2 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441.<\/p>\n<p>  <a name=\"commit_5e8674dc\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4613\/\">PL\/pgSQL: \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0434\u043b\u044f \u0442\u0438\u043f\u043e\u0432 %TYPE \u0438 %ROWTYPE<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/5e8674dc\">5e8674dc<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 PL\/pgSQL \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0441 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432 %TYPE \u0438 %ROWTYPE.<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">DO $$ DECLARE     seats_list seats.seat_no%TYPE[] :=         (SELECT array_agg(seat_no)          FROM seats          WHERE aircraft_code = '733' AND          fare_conditions = 'Business'); BEGIN     RAISE NOTICE '%', seats_list; END; $$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  {1A,1C,1D,1F,2A,2C,2D,2F,3A,3C,3D,3F} DO<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 <code>table_name%ROWTYPE[]<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.depesz.com\/2024\/01\/22\/waiting-for-postgresql-17-in-plpgsql-allow-type-and-rowtype-to-be-followed-by-array-decoration\/\">Waiting for PostgreSQL 17 \u2013 In plpgsql, allow %TYPE and %ROWTYPE to be followed by array decoration.<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<\/p>\n<p>  <a name=\"commit_66ea94e8\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4526\/\">jsonpath: \u043d\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/66ea94e8\">66ea94e8<\/a><\/p>\n<p>  <\/p>\n<p>\u0412 \u044f\u0437\u044b\u043a jsonpath, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c SQL, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043d\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: .bigint(), .boolean(), .date(), .decimal(), .integer(), .number(), .string(), .time(), .time_tz(), .timestamp(), .timestamp_tz().<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">\\set json '{\"key1\": 42, \"key2\": \"t\", \"key3\": \"Hello, World!\"}'  SELECT jsonb_path_query(:'json', '$.key1.integer()'),        jsonb_path_query(:'json', '$.key2.boolean()'),        jsonb_path_query(:'json', '$.key3.string()');<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> jsonb_path_query | jsonb_path_query | jsonb_path_query ------------------+------------------+------------------  42               | true             | \"Hello, World!\"<\/code><\/pre>\n<p>  <a name=\"commit_9e2d8701\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/3817\/\">COPY\u2026 FROM: \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/9e2d8701\">9e2d8701<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/b725b7ee\">b725b7ee<\/a>, <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/72943960\">72943960<\/a><\/p>\n<p>  <\/p>\n<p>\u041e\u0448\u0438\u0431\u043a\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 COPY\u2026 FROM \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0442\u043a\u0430\u0442\u0443 \u0432\u0441\u0435\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438. \u0411\u044b\u043b\u043e \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0434\u0435\u043b\u0430\u043d \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 COPY\u2026 FROM \u043d\u0430\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. \u041e\u0441\u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u0438 <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/732916\/\">\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u00ab\u043c\u044f\u0433\u043a\u043e\u0439\u00bb \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/a>, \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0432 16-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE t (id int PRIMARY KEY);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 \u043a\u043e\u043c\u0430\u043d\u0434\u044b COPY \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440<code>on_error<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <code>stop<\/code> \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u0441 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0435. \u0412\u0442\u043e\u0440\u043e\u0435 \u0438 \u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>ignore<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">COPY t FROM STDIN (on_error 'ignore'); Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself, or an EOF signal. >> 1 >> \u0434\u0432\u0430 >> 3 >> \\.<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">NOTICE:  1 row was skipped due to data type incompatibility COPY 2<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0437 \u0442\u0440\u0435\u0445 \u0441\u0442\u0440\u043e\u043a \u0431\u044b\u043b\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0434\u0432\u0435. \u041e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u043e \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u043b\u0433\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 tuples_skipped \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f pg_stat_progress_copy (\u0442\u0440\u0435\u0442\u0438\u0439 \u043a\u043e\u043c\u043c\u0438\u0442).<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0436\u0435 \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b? \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <code>on_error<\/code>\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>file<\/code> \u0438 <code>table<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432. \u041b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0431\u0443\u0434\u0443\u0442 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0438 \u043e\u0442\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u0422\u0430\u043a, \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043e\u0448\u0438\u0431\u043a\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430, \u0447\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">COPY t FROM STDIN (on_error 'ignore'); Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself, or an EOF signal. >> 3 >> 4 >> \\.<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ERROR:  duplicate key value violates unique constraint \"t_pkey\" DETAIL:  Key (id)=(3) already exists. CONTEXT:  COPY t, line 1<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT * FROM t;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> id ----   1   3 (2 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.depesz.com\/2024\/02\/07\/waiting-for-postgresql-17-add-new-copy-option-save_error_to-rename-copy-option-from-save_error_to-to-on_error\/\">Waiting for PostgreSQL 17 \u2013 Add new COPY option SAVE_ERROR_TO \/ Rename COPY option from SAVE_ERROR_TO to ON_ERROR<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<\/p>\n<p>  <a name=\"commit_8ba6fdf9\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4362\/\">to_timestamp: \u0444\u043e\u0440\u043c\u0430\u0442\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 TZ \u0438 OF<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/8ba6fdf9\">8ba6fdf9<\/a><\/p>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f to_char \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 TZ (\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u0430) \u0438 OF (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u044f\u0441\u0430 \u043e\u0442 UTC).<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u044d\u0442\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043d\u044b\u0445 \u043c\u0430\u0441\u043e\u043a \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f to_timestamp:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT to_timestamp('2024-02-18 23:50:00MSK', 'YYYY-MM-DD HH24:MI:SSTZ') tz,        to_timestamp('2024-02-18 23:50:00+03', 'YYYY-MM-DD HH24:MI:SSOF') of;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\">           tz           |           of            ------------------------+------------------------  2024-02-18 23:50:00+03 | 2024-02-18 23:50:00+03<\/code><\/pre>\n<p>  <a name=\"commit_69958631\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4737\/\">GENERATED AS IDENTITY \u0432 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/69958631\">69958631<\/a><\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u043e\u043b\u0431\u0446\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u0430\u043a GENERATED AS IDENTITY, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (ATTACH PARTITION) \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u044f \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e, \u0442\u0430\u043a \u0438 \u0432 \u0441\u0430\u043c\u0443 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u041f\u0440\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 (DETACH PARTITION) \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.depesz.com\/2024\/02\/07\/waiting-for-postgresql-17-support-identity-columns-in-partitioned-tables\/\">Waiting for PostgreSQL 17 \u2013 Support identity columns in partitioned tables<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<\/p>\n<p>  <a name=\"commit_5d06e99a\"><\/a>  <\/p>\n<p><strong><a href=\"https:\/\/commitfest.postgresql.org\/46\/4473\/\">ALTER COLUMN\u2026 SET EXPRESSION<\/a><\/strong><br \/>  commit: <a href=\"https:\/\/github.com\/postgres\/postgres\/commit\/5d06e99a\">5d06e99a<\/a><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0420\u0430\u043d\u044c\u0448\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e \u0442\u0440\u0435\u043c \u0443\u0437\u043b\u0430\u043c \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 node:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">CREATE TABLE t (     id int PRIMARY KEY,     node int GENERATED ALWAYS AS (mod(id, 3)) STORED );  WITH ins AS (     INSERT INTO t SELECT x FROM generate_series(1,100) AS x     RETURNING * ) SELECT node, count(*) FROM ins GROUP BY 1 ORDER BY 1;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> node | count ------+-------     0 |    33     1 |    34     2 |    33 (3 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0437\u043b\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">ALTER TABLE t ALTER COLUMN node SET EXPRESSION AS (mod(id, 4));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"pgsql\">SELECT node, count(*) FROM t GROUP BY 1 ORDER BY 1;<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> node | count ------+-------     0 |    25     1 |    25     2 |    25     3 |    25 (4 rows)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043c. \u0442\u0430\u043a\u0436\u0435<br \/>  <a href=\"https:\/\/www.depesz.com\/2024\/01\/15\/waiting-for-postgresql-17-alter-table-command-to-change-generation-expression\/\">Waiting for PostgreSQL 17 \u2013 ALTER TABLE command to change generation expression<\/a> (Hubert &#8216;depesz&#8217; Lubaczewski)<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u043e\u043a\u0430 \u0432\u0441\u0451. \u0412\u043f\u0435\u0440\u0435\u0434\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043c\u0430\u0440\u0442\u043e\u0432\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/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\/articles\/804027\/\"> https:\/\/habr.com\/ru\/articles\/804027\/<\/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><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/vh\/xc\/yn\/vhxcynazoiqklcuz8lkkm1icazc.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/vh\/xc\/yn\/vhxcynazoiqklcuz8lkkm1icazc.jpeg\" data-blurred=\"true\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u043d\u0430 \u0443\u0436\u0435 \u0432 \u0440\u0430\u0437\u0433\u0430\u0440\u0435, \u0430 \u043c\u044b \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0441\u0430\u043c\u043e\u0433\u043e \u0437\u0438\u043c\u043d\u0435\u0433\u043e, \u044f\u043d\u0432\u0430\u0440\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0444\u0435\u0441\u0442\u0430. \u0418 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043a\u043e\u0437\u044b\u0440\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043e 17-\u0439 \u0432\u0435\u0440\u0441\u0438\u0438: <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/757028\/\">2023-07<\/a>, <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/769598\/\">2023-09<\/a>, <a href=\"https:\/\/habr.com\/ru\/companies\/postgrespro\/articles\/782042\/\">2023-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-372242","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/372242","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=372242"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/372242\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=372242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=372242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=372242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}