{"id":317929,"date":"2021-02-12T15:02:22","date_gmt":"2021-02-12T15:02:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=317929"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=317929","title":{"rendered":"DBA: \u00ab\u041a\u0442\u043e-\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0435\u0441\u0442!\u00bb"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0422\u0435\u043c\u0430 <strong>&#171;\u0440\u0430\u0441\u043f\u0443\u0445\u0430\u043d\u0438\u044f&#187; \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432<\/strong> \u0438\u0437-\u0437\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/mvcc-intro\">MVCC<\/a> &#8212; \u0431\u043e\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PostgreSQL.<\/p>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b \u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/481866\/\">&#171;DBA: \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u0441\u0443\u0435\u0442 VACUUM \u2014 \u0447\u0438\u0441\u0442\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e&#187;<\/a>, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 <code>VACUUM<\/code>.<\/p>\n<p>\u041d\u043e, \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0438 \u0444\u0430\u043a\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u0437\u0430\u043d\u044f\u0442\u043e\u0435 \u043c\u0435\u0441\u0442\u043e. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 &#171;\u0436\u0438\u0432\u043e\u0439&#187; \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 <code>autovacuum<\/code> \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438\u0445 SSD.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u043a\u043e\u043f\u043d\u0435\u043c <code>pg_catalog<\/code> &#8212; \u0441\u0445\u0435\u043c\u0443 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0431\u0430\u0437\u044b PostgreSQL, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <strong>\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430<\/strong>.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/607\/9e7\/dff\/6079e7dff48a475fa9a9928bb08b7b55\" width=\"512\" height=\"384\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0431\u043b\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043d\u0430 PostgreSQL 12, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0441\u0430\u0439\u0434-\u044d\u0444\u0444\u0435\u043a\u0442\u044b MVCC.<\/p>\n<pre><code class=\"sql\">CREATE TABLE bloat AS SELECT 0 i;  CREATE INDEX ON bloat(i);  -- \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \"\u043f\u0440\u044f\u0442\u0430\u0442\u044c\" \u0432 pg_temp, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0447\u0438\u0449\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e CREATE OR REPLACE PROCEDURE pg_temp.upd() AS $$   UPDATE bloat SET i = i + 1; $$ LANGUAGE sql; -- \u0438 \u0434\u0430, \u044d\u0442\u043e plainSQL-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u0430 \u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f  DO $$ DECLARE   i integer;   ts timestamp; BEGIN   FOR i IN 1 .. 1 &lt;&lt; 14 LOOP     ts := clock_timestamp();     CALL pg_temp.upd();     RAISE NOTICE '% : %', i, clock_timestamp() - ts;   END LOOP; END; $$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>UPDATE<\/code> \u043d\u0430\u0448\u0435\u0439 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0422\u043e\u0447\u043d\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439?<\/p>\n<pre><code class=\"sql\">TABLE bloat;<\/code><\/pre>\n<pre><code>  i ----- 16384<\/code><\/pre>\n<p>\u0418 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u0447\u0430\u0441\u0442\u044c\u0435 \u0438\u0437 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442?<\/p>\n<pre><code class=\"sql\">SELECT pg_relation_size('bloat'); -- 598016<\/code><\/pre>\n<p>\u041e\u0443&#8230; \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u0430! \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0444\u043e\u043a\u0443\u0441 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442, \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f HOT-update. \u041d\u043e \u0438 \u0442\u0443\u0442 \u043d\u0430\u043c \u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043e\u0447\u044c <code>VACUUM<\/code> &#8212; \u0432\u0435\u0434\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u0435\u0448\u0430\u044e\u0449\u0438\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442\u0443!<\/p>\n<pre><code class=\"sql\">VACUUM bloat; -- ... \u0438 \u043d\u0435\u0442! SELECT pg_relation_size('bloat'); -- 598016<\/code><\/pre>\n<h4>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u0432\u043f\u043e\u0440\u0443 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-file-layout\">\u043f\u0440\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b (<code>pg_class.relfilenode<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0435 1GB<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 <strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/strong> \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e (\u043e\u0431\u044b\u0447\u043d\u043e) 8KB<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e <strong>\u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>&#171;\u041e\u0431\u044b\u0447\u043d\u044b\u0439&#187; <code>VACUUM<\/code> (\u043d\u0435<code>VACUUM FULL<\/code>) \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u0430\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 &#8212; \u043d\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, \u043d\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u0432 &#171;\u0445\u0432\u043e\u0441\u0442&#187; \u0438\u0437 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/p>\n<p> \u0410 \u043d\u0430\u0448\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f &#171;\u0436\u0438\u0432\u0430\u044f&#187; \u0437\u0430\u043f\u0438\u0441\u044c \u043b\u0435\u0436\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u043d\u044f\u0442\u044b &#171;\u043c\u0435\u0440\u0442\u0432\u044b\u043c\u0438&#187; &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 <code>VACUUM<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0441\u0440\u0435\u0437\u0430\u043b.<\/p>\n<h2>\u0412 \u043d\u0435\u0434\u0440\u0430\u0445 pg_catalog<\/h2>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalogs\">pg_catalog<\/a> &#8212; \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043c\u0438\u0440\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u044b &#8212; \u0441\u0445\u0435\u043c\u044b, \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u043e\u043b\u044f, \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430, &#8230; \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 <a href=\"https:\/\/joelonsql.com\/2016\/12\/10\/pg_catalog-visualized\/\">\u0441\u0445\u0435\u043c\u0443 \u043e\u0442 Joel Jacobson<\/a>. \u041d\u043e \u043d\u0430\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0431\u0430\u0437\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-namespace\">pg_namespace<\/a> &#8212; \u0441\u0445\u0435\u043c\u044b (schema)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-class\">pg_class<\/a> &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b &#8212; \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, matview, &#8230;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-depend\">pg_depend<\/a> &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u0441\u0445\u0435\u043c \u0438 \u0442\u0430\u0431\u043b\u0438\u0446<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-attribute\">pg_attribute<\/a> &#8212; \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0442\u0430\u0431\u043b\u0438\u0446<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-statistic\">pg_statistic<\/a> &#8212; \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 &#171;\u0440\u0430\u0437\u0434\u0443\u0442\u043e\u0441\u0442\u0438&#187; \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445):<\/p>\n<ul>\n<li>\n<p>\u043e\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f (<code>pg_depend<\/code>) \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 (<code>pg_namespace<\/code>) <code>public<\/code> (\u0447\u0442\u043e\u0431\u044b \u0432 \u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 <code>pg_catalog<\/code> \u0438 <code>information_schema<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (<code>pg_class.relpages<\/code>) \u0432 \u043d\u0435\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (<code>pg_class.reltuples<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 &#171;\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e&#187; \u043c\u044b \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (<code>pg_statistic<\/code>) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (<code>pg_attribute<\/code>) \u043f\u043e\u0439\u043c\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (<code>pg_statistic.stanullfrac<\/code>) \u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>pg_statistic.stawidth<\/code>) \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f (<code>pg_attribute.attalign<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e &#171;\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c&#187; \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout\">\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/a> \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e<\/p>\n<\/li>\n<\/ul>\n<h2>\u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> &#8212; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0442\u0443\u0434\u0430 &#171;\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c&#187;?<\/p>\n<p>\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 PostgreSQL, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0433\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0432\u043d\u044b\u043c 8KB. \u041d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c, \u0447\u0435\u043c \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u0431\u0443\u0434\u0435\u0442 \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0435 \u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/runtime-config-preset\">block_size<\/a>:<\/p>\n<pre><code class=\"sql\">SELECT current_setting('block_size')::integer; -- 8192<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout#STORAGE-PAGE-LAYOUT-FIGURE\">\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0443<\/a>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0432\u0441\u044e \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4bf\/808\/8da\/4bf8088dabf94e51659a4d442641940b.png\" alt=\"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\" title=\"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\" width=\"694\" height=\"178\"><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/figcaption><\/figure>\n<ul>\n<li>\n<p><code>PageHeaderData<\/code> &#8212; <strong>24 \u0431\u0430\u0439\u0442\u0430<\/strong> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout#PAGEHEADERDATA-TABLE\">\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><code>ItemIdData<\/code> &#8212; <strong>\u043f\u043e 4 \u0431\u0430\u0439\u0442\u0430<\/strong> \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c<\/p>\n<\/li>\n<li>\n<p><code>HeapTupleHeaderData<\/code> &#8212; <strong>\u043f\u043e 23 \u0431\u0430\u0439\u0442\u0430<\/strong> <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout#HEAPTUPLEHEADERDATA-TABLE\">\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c<\/a> \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (32-bit -&gt; 4 \u0431\u0430\u0439\u0442\u0430, 64-bit -&gt; 8 \u0431\u0430\u0439\u0442)<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u043e\u0440\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c 27 \u0431\u0430\u0439\u0442, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u0444\u0430\u043a\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/389\/894\/c77\/389894c7762d81fa9398e00ea8bbb0ae.png\" alt=\"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 HeapTupleHeaderData\" title=\"\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 HeapTupleHeaderData\" width=\"799\" height=\"301\"><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 HeapTupleHeaderData<\/figcaption><\/figure>\n<p><a href=\"https:\/\/doxygen.postgresql.org\/htup__details_8h_source.html#l00121\">\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445<\/a>, <code>t_cid<\/code><em> <\/em>\u0438 <code>t_xvac<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043a\u0430\u043a C-union, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 <strong>\u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 4 \u0431\u0430\u0439\u0442\u0430<\/strong>.<\/p>\n<h4>&#171;\u041f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435&#187; NULL&#8217;\u044b<\/h4>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u043f\u043e\u043b\u0435\u0439, \u0442\u043e \u0432 <code>HeapTupleHeaderData<\/code> \u043a 23 &#171;\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c&#187; \u0431\u0430\u0439\u0442\u0430\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u0437\u0430\u043f\u0438\u0441\u0438 <strong>8 \u043f\u043e\u043b\u0435\u0439<\/strong> \u0438 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 NULL, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0431\u0443\u0434\u0435\u0442 1 \u0431\u0430\u0439\u0442, \u0447\u0442\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 \u0434\u0430\u0441\u0442 <strong>24 \u0431\u0430\u0439\u0442\u0430<\/strong> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f. \u0410 \u0432\u043e\u0442 <strong>\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435\u0439 9<\/strong>, \u0442\u043e \u043e\u0439&#8230; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f 2 \u0431\u0430\u0439\u0442\u0430, \u0447\u0442\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 \u0434\u0430\u0441\u0442 \u0443\u0436\u0435 25, \u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 64-bit \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 &#8212; <strong>\u0443\u0436\u0435 32 \u0431\u0430\u0439\u0442\u0430<\/strong>.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c <strong>\u0432 &#171;\u0442\u0435\u043b\u0435&#187; \u0437\u0430\u043f\u0438\u0441\u0438 NULL \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f<\/strong> \u043d\u0438\u043a\u0430\u043a \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442.<\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438<\/h4>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 NULL <strong>\u0432 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u0435\u0435 \u043f\u043e\u043b\u0435\u0439<\/strong>, \u0430 \u0432 <code>pg_statistic.stanullfrac<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0434\u043e\u043b\u044f NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <strong>\u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f<\/strong>.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043b\u044e \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d NULL, \u043d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0430\u0434\u043e <strong>\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0442\u044c<\/strong> \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438. \u0410 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u0431\u044b \u0430\u0433\u0440\u0435\u0433\u0430\u0442-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u0443\u0432\u044b, \u043d\u0435\u0442\u0443 \u0441\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 <code>sum\/avg\/min\/max\/count<\/code>.<\/p>\n<p>\u041d\u0435 \u0431\u0435\u0434\u0430! \u0422\u0443\u0442 \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0434\u0435\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 &#171;\u0445\u0430\u043a&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/507056\/\">&#171;SQL HowTo: 1000 \u0438 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438&#187;<\/a>:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fy\/lt\/gt\/fyltgtgygx-3cqqvq7vd_3wnfgs.png\" alt=\"P = exp(sum(ln(...)))\" title=\"P = exp(sum(ln(...)))\" width=\"204\" height=\"99\"><figcaption>P = exp(sum(ln(&#8230;)))<\/figcaption><\/figure>\n<h2>\u041f\u043e\u0440\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434!<\/h2>\n<p>\u0414\u043b\u044f \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043a\u0430\u043a \u043d\u0430\u0448\u0430, \u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0434 \u043d\u0435\u0439 \u0438\u0437\u0434\u0435\u0432\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"sql\">CREATE TABLE nobloat AS SELECT 0 i;  CREATE INDEX ON nobloat(i);<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/20c\/abd\/e0b\/20cabde0b58c70f9b3c1a308014b5c85.jpg\" width=\"1023\" height=\"576\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"sql\">-- objects-in-scheme WITH dep AS (   -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-depend   SELECT     objid   FROM     pg_depend   WHERE     (       refclassid     , refobjid     , classid     ) = (       'pg_namespace'::regclass     , (         -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-namespace         SELECT           oid         FROM           pg_namespace         WHERE           nspname = 'public' -- schema         LIMIT 1       )     , 'pg_class'::regclass     ) ) -- objects , cl AS (   -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-class   SELECT     oid   , relname   , relpages   , reltuples   FROM     pg_class cl   WHERE     oid = ANY(ARRAY(TABLE dep)::oid[]) AND     relkind IN ('r', 'm', 'p') -- relation | matview | partition ) SELECT   T.* , cl.* , CASE     WHEN ratio &gt;= 1 THEN (ratio - 1) * def.PAGESIZE   END::bigint repack_effect_size FROM   (     -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout     SELECT       current_setting('block_size')::integer PAGESIZE     , CASE         WHEN version() ~ 'mingw32' OR version() ~ '64-bit' THEN 8         ELSE 4       END MAXALIGN   ) def , cl , LATERAL (     WITH cols AS (       SELECT         *       , (sz + szq - 1) \/ szq * szq sza -- aligned size       FROM         (             -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-attribute             -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-statistic             SELECT               attname             , attnum             , coalesce(st.stanullfrac, 0) nfr             , CASE                 WHEN attlen = -1 THEN                   CASE                     WHEN attstorage IN ('p', 'm') OR stawidth &lt; 2048 THEN -- toast_tuple_target                       stawidth                     ELSE 8 -- len + toast_id                   END                 ELSE attlen               END sz             , CASE attalign                 WHEN 'c' THEN 1                 WHEN 's' THEN 2                 WHEN 'i' THEN 4                 WHEN 'd' THEN 8               END szq             FROM               pg_attribute at             LEFT JOIN               pg_statistic st                 ON (st.starelid, st.staattnum) = (at.attrelid, at.attnum)             WHERE               at.attrelid = cl.oid AND               NOT at.attisdropped AND -- without dropped columns               at.attnum &gt; 0           -- without system columns (tableoid, ctid, ...)             ORDER BY               attnum         ) T     )     SELECT       CASE         WHEN reltuples = 0 AND relpages = 0 THEN 1         WHEN reltuples = 0 AND relpages &gt; 0 THEN NULL         ELSE           relpages \/             ceil( -- need pages               reltuples \/                 (                   (PAGESIZE - 24) \/ -- PageHeaderData                     ceil(szt::double precision \/ reltuples)::bigint -- avg tuple size                 ) -- tuples-per-page             )       END ratio     FROM       (         SELECT           reltuples * 4 + -- ItemIdData           (             (reltuples - fnnt) * hdr_tuple_w_nulls + -- hdr, tuples w\/nulls             fnnt * hdr_tuple_wo_nulls                -- hdr, tuples wo\/nulls           ) +           sztc szt -- size of tuples         FROM           (             SELECT               sztc             , fnnt               -- aligned headers             , ceil(hdr_cols_sys::double precision \/ MAXALIGN)::integer * MAXALIGN hdr_tuple_wo_nulls             , ceil((hdr_cols_sys + hdr_cols_null)::double precision \/ MAXALIGN)::integer * MAXALIGN hdr_tuple_w_nulls             FROM               (                 SELECT                   -- https:\/\/doxygen.postgresql.org\/htup__details_8h_source.html#l00121                   -- 4 : t_xmin                   -- 4 : t_xmax                   -- 4 : t_cid | t_xvac                   -- 6 : t_ctid                   -- 2 : t_infomask2                   -- 2 : t_infomask                   -- 1 : t_hoff                   23 hdr_cols_sys                 , ceil(count(*)::double precision \/ 8)::integer hdr_cols_null                 , sum(ceil(sza * reltuples * (1 - nfr))) sztc -- size of tuples cols                 , trunc(exp(sum(ln(CASE WHEN nfr &lt; 1 THEN 1 - nfr ELSE 1 END))) * reltuples) fnnt -- full-not-null-tuples                 FROM                   cols               ) T           ) T       ) T   ) T; <\/code><\/pre>\n<p>\u0427\u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435?<\/p>\n<pre><code>ratio |   oid | relname | relpages | reltuples | repack_effect_size -------------------------------------------------------------------    73 | 41333 | bloat   |       73 |        15 |             589824     1 | 41337 | nobloat |        1 |         1 |                  0<\/code><\/pre>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e PostgreSQL \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 <code>bloat<\/code> \u0443 \u043d\u0430\u0441 15 \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0430 \u043d\u0435 1, \u043a\u0430\u043a \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 &#8212; \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0432\u0440\u0435\u043c\u044f <code>ANALYZE<\/code>. \u0420\u043e\u0432\u043d\u043e \u043f\u043e \u0442\u043e\u0439 \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e <code>ratio<\/code> \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 1.<\/p>\n<p>\u0410 \u0434\u0430\u043b\u044c\u0448\u0435 &#8212; \u0441\u0430\u043c\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0439\u0442\u0435\u0441\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 &#171;\u0441\u0436\u0438\u043c\u0430\u0442\u044c&#187; \u0438 \u0447\u0435\u043c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/sql-vacuum\">VACUUM FULL<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/dataegret\/pgcompacttable\">pgcompacttable<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p> \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\/tensor\/blog\/542058\/\"> https:\/\/habr.com\/ru\/company\/tensor\/blog\/542058\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>\u0422\u0435\u043c\u0430 <strong>&#171;\u0440\u0430\u0441\u043f\u0443\u0445\u0430\u043d\u0438\u044f&#187; \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432<\/strong> \u0438\u0437-\u0437\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/mvcc-intro\">MVCC<\/a> &#8212; \u0431\u043e\u043b\u044c\u043d\u0430\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PostgreSQL.<\/p>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b \u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/481866\/\">&#171;DBA: \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u0441\u0443\u0435\u0442 VACUUM \u2014 \u0447\u0438\u0441\u0442\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e&#187;<\/a>, \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0432 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0438\u043b\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 <code>VACUUM<\/code>.<\/p>\n<p>\u041d\u043e, \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0438 \u0444\u0430\u043a\u0442 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u0430 \u0437\u0430\u043d\u044f\u0442\u043e\u0435 \u043c\u0435\u0441\u0442\u043e. \u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u044b \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 &#171;\u0436\u0438\u0432\u043e\u0439&#187; \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430 <code>autovacuum<\/code> \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043d\u0430 \u0434\u043e\u0440\u043e\u0433\u0438\u0445 SSD.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0430\u0439\u043b\u0430\u0445 \u0438 \u043a\u043e\u043f\u043d\u0435\u043c <code>pg_catalog<\/code> &#8212; \u0441\u0445\u0435\u043c\u0443 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0431\u0430\u0437\u044b PostgreSQL, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c <strong>\u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043d\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430<\/strong>.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<h2>\u041a\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0430 \u0433\u0440\u0430\u0431\u043b\u0438<\/h2>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043c\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043c \u043d\u0430 PostgreSQL 12, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0442\u0430\u0440\u0430\u044e\u0442\u0441\u044f \u0441\u043d\u0438\u0437\u0438\u0442\u044c \u0441\u0430\u0439\u0434-\u044d\u0444\u0444\u0435\u043a\u0442\u044b MVCC.<\/p>\n<pre><code class=\"sql\">CREATE TABLE bloat AS SELECT 0 i;  CREATE INDEX ON bloat(i);  -- \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \"\u043f\u0440\u044f\u0442\u0430\u0442\u044c\" \u0432 pg_temp, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0447\u0438\u0449\u0430\u0442\u044c \u043f\u043e\u0442\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e CREATE OR REPLACE PROCEDURE pg_temp.upd() AS $$   UPDATE bloat SET i = i + 1; $$ LANGUAGE sql; -- \u0438 \u0434\u0430, \u044d\u0442\u043e plainSQL-\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u0430 \u043d\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044f  DO $$ DECLARE   i integer;   ts timestamp; BEGIN   FOR i IN 1 .. 1 &lt;&lt; 14 LOOP     ts := clock_timestamp();     CALL pg_temp.upd();     RAISE NOTICE '% : %', i, clock_timestamp() - ts;   END LOOP; END; $$ LANGUAGE plpgsql;<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u0432\u0438\u0434\u0435\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u0443\u0435\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <code>UPDATE<\/code> \u043d\u0430\u0448\u0435\u0439 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438. \u0422\u043e\u0447\u043d\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439?<\/p>\n<pre><code class=\"sql\">TABLE bloat;<\/code><\/pre>\n<pre><code>  i ----- 16384<\/code><\/pre>\n<p>\u0418 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0432\u0441\u0435 \u044d\u0442\u043e \u0441\u0447\u0430\u0441\u0442\u044c\u0435 \u0438\u0437 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442?<\/p>\n<pre><code class=\"sql\">SELECT pg_relation_size('bloat'); -- 598016<\/code><\/pre>\n<p>\u041e\u0443&#8230; \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u0430! \u0417\u0430\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0444\u043e\u043a\u0443\u0441 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0435\u0442, \u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f HOT-update. \u041d\u043e \u0438 \u0442\u0443\u0442 \u043d\u0430\u043c \u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043c\u043e\u0447\u044c <code>VACUUM<\/code> &#8212; \u0432\u0435\u0434\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u0435\u0448\u0430\u044e\u0449\u0438\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442\u0443!<\/p>\n<pre><code class=\"sql\">VACUUM bloat; -- ... \u0438 \u043d\u0435\u0442! SELECT pg_relation_size('bloat'); -- 598016<\/code><\/pre>\n<h4>\u0425\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u0432\u043f\u043e\u0440\u0443 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-file-layout\">\u043f\u0440\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b (<code>pg_class.relfilenode<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b, \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u044e\u0449\u0438\u0435 1GB<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 <strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446<\/strong> \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e (\u043e\u0431\u044b\u0447\u043d\u043e) 8KB<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e <strong>\u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/strong><\/p>\n<\/li>\n<\/ul>\n<p>&#171;\u041e\u0431\u044b\u0447\u043d\u044b\u0439&#187; <code>VACUUM<\/code> (\u043d\u0435<code>VACUUM FULL<\/code>) \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u0441\u0430\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 &#8212; \u043d\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, \u043d\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0435\u0437\u0430\u0432 &#171;\u0445\u0432\u043e\u0441\u0442&#187; \u0438\u0437 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u0443\u0441\u0442\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446.<\/p>\n<p> \u0410 \u043d\u0430\u0448\u0430 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f &#171;\u0436\u0438\u0432\u0430\u044f&#187; \u0437\u0430\u043f\u0438\u0441\u044c \u043b\u0435\u0436\u0438\u0442 \u0440\u043e\u0432\u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u043d\u044f\u0442\u044b &#171;\u043c\u0435\u0440\u0442\u0432\u044b\u043c\u0438&#187; &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 <code>VACUUM<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u0438 \u043d\u0435 \u0441\u0440\u0435\u0437\u0430\u043b.<\/p>\n<h2>\u0412 \u043d\u0435\u0434\u0440\u0430\u0445 pg_catalog<\/h2>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalogs\">pg_catalog<\/a> &#8212; \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u043c\u0438\u0440\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0431\u0430\u0437\u044b &#8212; \u0441\u0445\u0435\u043c\u044b, \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, \u043f\u043e\u043b\u044f, \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430, &#8230; \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 <a href=\"https:\/\/joelonsql.com\/2016\/12\/10\/pg_catalog-visualized\/\">\u0441\u0445\u0435\u043c\u0443 \u043e\u0442 Joel Jacobson<\/a>. \u041d\u043e \u043d\u0430\u043c \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0431\u0430\u0437\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-namespace\">pg_namespace<\/a> &#8212; \u0441\u0445\u0435\u043c\u044b (schema)<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-class\">pg_class<\/a> &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b &#8212; \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u043d\u0434\u0435\u043a\u0441\u044b, matview, &#8230;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-depend\">pg_depend<\/a> &#8212; \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 &#8212; \u0441\u0445\u0435\u043c \u0438 \u0442\u0430\u0431\u043b\u0438\u0446<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-attribute\">pg_attribute<\/a> &#8212; \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0442\u0430\u0431\u043b\u0438\u0446<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-statistic\">pg_statistic<\/a> &#8212; \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 &#171;\u0440\u0430\u0437\u0434\u0443\u0442\u043e\u0441\u0442\u0438&#187; \u043d\u0430\u0448\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445):<\/p>\n<ul>\n<li>\n<p>\u043e\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f (<code>pg_depend<\/code>) \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 (<code>pg_namespace<\/code>) <code>public<\/code> (\u0447\u0442\u043e\u0431\u044b \u0432 \u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u043b\u0438 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 <code>pg_catalog<\/code> \u0438 <code>information_schema<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (<code>pg_class.relpages<\/code>) \u0432 \u043d\u0435\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (<code>pg_class.reltuples<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0447\u0442\u043e\u0431\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 &#171;\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e&#187; \u043c\u044b \u043f\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 (<code>pg_statistic<\/code>) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (<code>pg_attribute<\/code>) \u043f\u043e\u0439\u043c\u0435\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (<code>pg_statistic.stanullfrac<\/code>) \u0438 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>pg_statistic.stawidth<\/code>) \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f (<code>pg_attribute.attalign<\/code>)<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0442\u043d\u043e &#171;\u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c&#187; \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout\">\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/a> \u043d\u0430 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e<\/p>\n<\/li>\n<\/ul>\n<h2>\u0423\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout\">\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> &#8212; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0442\u0443\u0434\u0430 &#171;\u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c&#187;?<\/p>\n<p>\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0434\u0432\u0438\u0436\u043a\u0430 PostgreSQL, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0435\u0433\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0432\u043d\u044b\u043c 8KB. \u041d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c, \u0447\u0435\u043c \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u0431\u0443\u0434\u0435\u0442 \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0435\u0435 \u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/runtime-config-preset\">block_size<\/a>:<\/p>\n<pre><code class=\"sql\">SELECT current_setting('block_size')::integer; -- 8192<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout#STORAGE-PAGE-LAYOUT-FIGURE\">\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0443<\/a>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0447\u0435\u0441\u0442\u044c \u0432\u0441\u044e \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<figure class=\"full-width\"><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/figcaption><\/figure>\n<ul>\n<li>\n<p><code>PageHeaderData<\/code> &#8212; <strong>24 \u0431\u0430\u0439\u0442\u0430<\/strong> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout#PAGEHEADERDATA-TABLE\">\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><code>ItemIdData<\/code> &#8212; <strong>\u043f\u043e 4 \u0431\u0430\u0439\u0442\u0430<\/strong> \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c<\/p>\n<\/li>\n<li>\n<p><code>HeapTupleHeaderData<\/code> &#8212; <strong>\u043f\u043e 23 \u0431\u0430\u0439\u0442\u0430<\/strong> <a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout#HEAPTUPLEHEADERDATA-TABLE\">\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c<\/a> \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043e \u0440\u0430\u0437\u0440\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (32-bit -&gt; 4 \u0431\u0430\u0439\u0442\u0430, 64-bit -&gt; 8 \u0431\u0430\u0439\u0442)<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0443\u0442 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u043f\u043e\u0440\u043d\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c 27 \u0431\u0430\u0439\u0442, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u0444\u0430\u043a\u0442:<\/p>\n<figure class=\"full-width\"><figcaption>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 HeapTupleHeaderData<\/figcaption><\/figure>\n<p><a href=\"https:\/\/doxygen.postgresql.org\/htup__details_8h_source.html#l00121\">\u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445<\/a>, <code>t_cid<\/code><em> <\/em>\u0438 <code>t_xvac<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043a\u0430\u043a C-union, \u0442\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 <strong>\u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 4 \u0431\u0430\u0439\u0442\u0430<\/strong>.<\/p>\n<h4>&#171;\u041f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435&#187; NULL&#8217;\u044b<\/h4>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0438. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u043f\u043e\u043b\u0435\u0439, \u0442\u043e \u0432 <code>HeapTupleHeaderData<\/code> \u043a 23 &#171;\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c&#187; \u0431\u0430\u0439\u0442\u0430\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u0437\u0430\u043f\u0438\u0441\u0438 <strong>8 \u043f\u043e\u043b\u0435\u0439<\/strong> \u0438 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 NULL, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0431\u0443\u0434\u0435\u0442 1 \u0431\u0430\u0439\u0442, \u0447\u0442\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 \u0434\u0430\u0441\u0442 <strong>24 \u0431\u0430\u0439\u0442\u0430<\/strong> \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f. \u0410 \u0432\u043e\u0442 <strong>\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0435\u0439 9<\/strong>, \u0442\u043e \u043e\u0439&#8230; \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f 2 \u0431\u0430\u0439\u0442\u0430, \u0447\u0442\u043e \u0432 \u0441\u0443\u043c\u043c\u0435 \u0434\u0430\u0441\u0442 \u0443\u0436\u0435 25, \u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0430 64-bit \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 &#8212; <strong>\u0443\u0436\u0435 32 \u0431\u0430\u0439\u0442\u0430<\/strong>.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c <strong>\u0432 &#171;\u0442\u0435\u043b\u0435&#187; \u0437\u0430\u043f\u0438\u0441\u0438 NULL \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f<\/strong> \u043d\u0438\u043a\u0430\u043a \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442.<\/p>\n<h4>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438<\/h4>\n<p>\u0417\u0430\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 NULL <strong>\u0432 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u0435\u0435 \u043f\u043e\u043b\u0435\u0439<\/strong>, \u0430 \u0432 <code>pg_statistic.stanullfrac<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0434\u043e\u043b\u044f NULL-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <strong>\u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f<\/strong>.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u043b\u044e \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d NULL, \u043d\u0430\u043c \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043d\u0430\u0434\u043e <strong>\u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0442\u044c<\/strong> \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438. \u0410 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0441\u044f \u0431\u044b \u0430\u0433\u0440\u0435\u0433\u0430\u0442-\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e, \u0443\u0432\u044b, \u043d\u0435\u0442\u0443 \u0441\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 <code>sum\/avg\/min\/max\/count<\/code>.<\/p>\n<p>\u041d\u0435 \u0431\u0435\u0434\u0430! \u0422\u0443\u0442 \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0434\u0435\u0442 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 &#171;\u0445\u0430\u043a&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/habr.com\/ru\/post\/507056\/\">&#171;SQL HowTo: 1000 \u0438 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438&#187;<\/a>:<\/p>\n<figure class=\"\"><figcaption>P = exp(sum(ln(&#8230;)))<\/figcaption><\/figure>\n<h2>\u041f\u043e\u0440\u0430 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434!<\/h2>\n<p>\u0414\u043b\u044f \u0441\u0430\u043c\u043e\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043a\u0430\u043a \u043d\u0430\u0448\u0430, \u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0434 \u043d\u0435\u0439 \u0438\u0437\u0434\u0435\u0432\u0430\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"sql\">CREATE TABLE nobloat AS SELECT 0 i;  CREATE INDEX ON nobloat(i);<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"sql\">-- objects-in-scheme WITH dep AS (   -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-depend   SELECT     objid   FROM     pg_depend   WHERE     (       refclassid     , refobjid     , classid     ) = (       'pg_namespace'::regclass     , (         -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-namespace         SELECT           oid         FROM           pg_namespace         WHERE           nspname = 'public' -- schema         LIMIT 1       )     , 'pg_class'::regclass     ) ) -- objects , cl AS (   -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-class   SELECT     oid   , relname   , relpages   , reltuples   FROM     pg_class cl   WHERE     oid = ANY(ARRAY(TABLE dep)::oid[]) AND     relkind IN ('r', 'm', 'p') -- relation | matview | partition ) SELECT   T.* , cl.* , CASE     WHEN ratio &gt;= 1 THEN (ratio - 1) * def.PAGESIZE   END::bigint repack_effect_size FROM   (     -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-page-layout     SELECT       current_setting('block_size')::integer PAGESIZE     , CASE         WHEN version() ~ 'mingw32' OR version() ~ '64-bit' THEN 8         ELSE 4       END MAXALIGN   ) def , cl , LATERAL (     WITH cols AS (       SELECT         *       , (sz + szq - 1) \/ szq * szq sza -- aligned size       FROM         (             -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-attribute             -- https:\/\/postgrespro.ru\/docs\/postgresql\/12\/catalog-pg-statistic             SELECT               attname             , attnum             , coalesce(st.stanullfrac, 0) nfr             , CASE                 WHEN attlen = -1 THEN                   CASE                     WHEN attstorage IN ('p', 'm') OR stawidth &lt; 2048 THEN -- toast_tuple_target                       stawidth                     ELSE 8 -- len + toast_id                   END                 ELSE attlen               END sz             , CASE attalign                 WHEN 'c' THEN 1                 WHEN 's' THEN 2                 WHEN 'i' THEN 4                 WHEN 'd' THEN 8               END szq             FROM               pg_attribute at             LEFT JOIN               pg_statistic st                 ON (st.starelid, st.staattnum) = (at.attrelid, at.attnum)             WHERE               at.attrelid = cl.oid AND               NOT at.attisdropped AND -- without dropped columns               at.attnum &gt; 0           -- without system columns (tableoid, ctid, ...)             ORDER BY               attnum         ) T     )     SELECT       CASE         WHEN reltuples = 0 AND relpages = 0 THEN 1         WHEN reltuples = 0 AND relpages &gt; 0 THEN NULL         ELSE           relpages \/             ceil( -- need pages               reltuples \/                 (                   (PAGESIZE - 24) \/ -- PageHeaderData                     ceil(szt::double precision \/ reltuples)::bigint -- avg tuple size                 ) -- tuples-per-page             )       END ratio     FROM       (         SELECT           reltuples * 4 + -- ItemIdData           (             (reltuples - fnnt) * hdr_tuple_w_nulls + -- hdr, tuples w\/nulls             fnnt * hdr_tuple_wo_nulls                -- hdr, tuples wo\/nulls           ) +<\/code><\/pre>\n<\/div>\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-317929","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/317929","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=317929"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/317929\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=317929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=317929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=317929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}