{"id":326030,"date":"2021-07-06T09:00:52","date_gmt":"2021-07-06T09:00:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=326030"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=326030","title":{"rendered":"\u041f\u043e\u0447\u0435\u043c\u0443 PostgreSQL \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442: \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>&#171;\u0425\u043e\u0447\u0435\u0448\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0441\u0442\u0440\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441&#187; \u2013 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 PostgreSQL. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 PostgreSQL \u0435\u0441\u0442\u044c, \u043d\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0438\u0441\u044c. \u041d\u0435 \u0432\u0441\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u2013 \u044d\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2013 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b6\/e76\/cb5\/2b6e76cb53b81513dcc8e5668fbddaef.png\" alt=\"\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\" title=\"\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\" width=\"1254\" height=\"727\"><figcaption>\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/figcaption><\/figure>\n<h2>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 pg_stats \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 correlation. \u0412<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/13\/view-pg-stats\"> <u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a> \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e <em>&#171;\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0441\u0442\u0440\u043e\u043a \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u0430&#187;<\/em>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"sql\">CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"; CREATE TABLE example (corr, uncorr) AS    SELECT i, uuid_generate_v4()    FROM generate_series(1, 100000) AS i; ANALYZE example;<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u043b\u044e corr \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e, \u0430 \u043f\u043e \u043f\u043e\u043b\u044e uncorr \u2013 \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e:<\/p>\n<pre><code class=\"sql\">select correlation from pg_stats where tablename = 'example' and attname = 'corr'; -[ RECORD 1 ]-- correlation | 1  select correlation from pg_stats where tablename = 'example' and attname = 'uncorr'; -[ RECORD 1 ]-------------- correlation | -0.0013047641<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 correlation \u0431\u043b\u0438\u0437\u043a\u0430 \u043a 1 \u0438\u043b\u0438 -1 \u2013 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0410 \u0434\u0430\u043d\u043d\u044b\u0435, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u043d\u0443\u043b\u044e \u2013 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u044b. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441. <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u0435\u0449\u0430\u0445 \u043d\u0430\u0441\u0447\u0451\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b PostgreSQL \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0431\u043b\u043e\u043a\u0430\u0445, \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430, PostgreSQL \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0431\u043b\u043e\u043a \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e (<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.6\/runtime-config-wal#guc-full-page-writes\"><u>\u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u043e\u0439<\/u><\/a>).<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0411\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 (Buffer Manager), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0411\u0443\u0444\u0435\u0440\u043d\u043e\u043c \u043a\u044d\u0448\u0435 (Buffer pool). \u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 (\u0431\u0430\u043a\u0435\u043d\u0434\u0443), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0432 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u043c \u043a\u044d\u0448\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0442\u044c &#171;\u0433\u0440\u044f\u0437\u043d\u0443\u044e&#187; (\u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441 \u0434\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443) \u0431\u0430\u043a\u0435\u043d\u0434\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430 \u0434\u0438\u0441\u043a.<\/p>\n<\/li>\n<li>\n<p>B-Tree \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 ctid (\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445). \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ctid \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0446\u0438\u0444\u0440: Block \u0438 Number. \u0422\u0443\u0442 Block \u2013 \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043b\u043e\u043a 0 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 0-8kB, \u0430 \u0431\u043b\u043e\u043a 10 \u2013 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 80kB-88kB. Number \u2013 \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440 &#171;\u0441\u0442\u0440\u043e\u043a\u0438&#187; \u0432 \u0431\u043b\u043e\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441\u044b PostgreSQL \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 ctid, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 Heap Fetches \u0432 explain, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/326096\/\"><u>\u0442\u0443\u0442<\/u><\/a>).<\/p>\n<\/li>\n<\/ul>\n<h2>\u0420\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b<\/h2>\n<p>\u0421\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u043d\u0430 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u0433\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u043b\u0435\u043a\u043e, \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, &#8216;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa&#8217;::uuid \u0438 &#8216;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaab&#8217;::uuid \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e (\u043e\u043a\u043e\u043b\u043e 99.9%) \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u044b \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a 21:<\/p>\n<pre><code class=\"sql\">CREATE INDEX corr_idx ON example (corr); CREATE INDEX uncorr_idx ON example (uncorr); ANALYZE example;  CREATE EXTENSION IF NOT EXISTS pageinspect;  -- \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0431\u043b\u043e\u043a 21 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2013 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043b\u0438\u0441\u0442 btree-\u0438\u043d\u0434\u0435\u043a\u0441\u0430 (l) SELECT corr.type, uncorr.type FROM bt_page_stats('corr_idx', 21) as corr, bt_page_stats('uncorr_idx', 21) as uncorr;  type | type ------+------  l    | l  -- \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c index items \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e ctid: (block, item) SELECT bt.ctid as corr_heap_ctid, e.corr, e.uncorr FROM bt_page_items('uncorr_idx', 21) as bt INNER JOIN example e on e.ctid = bt.ctid LIMIT 5 OFFSET 1;  corr_heap_ctid | corr  |                uncorr ----------------+-------+--------------------------------------  (5,77)         |   862 | 0cc6e023-8c62-4a89-a066-d3879c99667d  (227,155)      | 35794 | 0cc83303-ab36-4cb7-8f02-48ac8d1c22e4  (158,92)       | 24898 | 0cc93ffe-b54d-4d81-b7da-946aac5e9268  (177,10)       | 27799 | 0cc943c6-6551-45d9-ad02-69331a76773d  (98,136)       | 15522 | 0cca5867-9c1c-43e2-95fa-a5479e4a39cd  -- \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 SELECT bt.ctid as corr_heap_ctid, e.corr, e.uncorr FROM bt_page_items('corr_idx', 21) as bt INNER JOIN example e on e.ctid = bt.ctid LIMIT 5 OFFSET 1;  corr_heap_ctid | corr |                uncorr ----------------+------+--------------------------------------  (44,47)        | 6955 | 99e1675e-d402-4413-90cf-79c7b4bad88d  (44,48)        | 6956 | 3dd37835-8c24-4f13-b284-e533763cb65d  (44,49)        | 6957 | 1a18c970-f294-4a97-a31d-fae556c70be5  (44,50)        | 6958 | fbbb36ce-93c0-4068-9e0a-a3d367cc725c  (44,51)        | 6959 | d72c1154-23d3-4544-87b3-d7038c5be31b<\/code><\/pre>\n<p>\u0412 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0431\u043b\u043e\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u043b\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL \u0431\u044b\u043b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/346460\/\"> <u>BRIN<\/u><\/a>-\u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u0447\u0435\u043c B-Tree.<\/p>\n<p>\u0412 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e &#171;\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435&#187; (\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435) \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2a9\/904\/de0\/2a9904de0c2d77922439c3d11cb9f47f.png\" alt=\"\u041e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\" title=\"\u041e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\" width=\"485\" height=\"288\"><figcaption>\u041e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/figcaption><\/figure>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430:<\/p>\n<ul>\n<li>\n<p>\u041d\u0438\u0437\u043a\u0438\u0439 page hit (\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430) \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430: \u043d\u0435\u0442 &#171;\u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439&#187;, \u0442\u0430\u043a\u0438\u0445, \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0434\u043d\u044f \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 heap \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u0435\u0441\u043b\u0438  \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f bitmap heap scan.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0440\u043e\u0433\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430: \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a reindex\/vacuum, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/896\/c56\/a9e\/896c56a9ee344f1aad5e9e0e8d49f6f2.png\" alt=\"\u0421 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 &quot;\u0433\u043e\u0440\u044f\u0447\u0443\u044e&quot; \u0438 &quot;\u0445\u043e\u043b\u043e\u0434\u043d\u0443\u044e&quot; \u0447\u0430\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 buffer pool (\u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043a\u044d\u0448) \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e IOPS\" title=\"\u0421 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 &quot;\u0433\u043e\u0440\u044f\u0447\u0443\u044e&quot; \u0438 &quot;\u0445\u043e\u043b\u043e\u0434\u043d\u0443\u044e&quot; \u0447\u0430\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 buffer pool (\u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043a\u044d\u0448) \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e IOPS\" width=\"600\" height=\"791\"><figcaption>\u0421 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 &#171;\u0433\u043e\u0440\u044f\u0447\u0443\u044e&#187; \u0438 &#171;\u0445\u043e\u043b\u043e\u0434\u043d\u0443\u044e&#187; \u0447\u0430\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 buffer pool (\u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043a\u044d\u0448) \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e IOPS<\/figcaption><\/figure>\n<h2>\u041d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438<\/h2>\n<p>\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u2013 \u044d\u0442\u043e UUID v4, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0447\u0430\u0449\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043c\u0435\u043d\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0438\u043f\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: int, varchar. \u041f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u043d\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439, \u043d\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"sql\">CREATE TABLE test_read (     id bigserial primary key,     user_id int not null,     created_at timestamptz not null default current_timestamp,     value int ); CREATE INDEX idx_test_read_user_id_created_at on test_read (user_id, created_at desc);<\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"sql\">\\set user_id random(1, 2000) begin;  insert into test_read (user_id) values (:user_id); end;<\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u2013 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 N-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"sql\">explain (analyze,buffers) select value from test_read where user_id = 200 order by created_at limit 1000;                                                                                QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------  Limit  (cost=0.57..3883.09 rows=1000 width=12) (actual time=0.044..1.769 rows=1000 loops=1)    Buffers: shared hit=969    -&gt;  Index Scan Backward using idx_test_read_user_id_created_at on test_read  (cost=0.57..252547.29 rows=65047 width=12) (actual time=0.042..1.664 rows=1000 loops=1)          Index Cond: (user_id = 200)          Buffers: shared hit=969<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e IOPS), \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u0435\u043a:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u221d<\/strong> <strong>IOPS)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>10<\/p>\n<\/td>\n<td>\n<p>14<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>100<\/p>\n<\/td>\n<td>\n<p>100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1000<\/p>\n<\/td>\n<td>\n<p>969<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0430\u043a \u043c\u044b \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/13\/sql-cluster\"> <u>CLUSTER<\/u><\/a>:<\/p>\n<pre><code class=\"sql\">cluster test_read using test_read_user_id_idx;<\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u221d IOPS)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>10<\/p>\n<\/td>\n<td>\n<p>11<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>100<\/p>\n<\/td>\n<td>\n<p>53<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1000<\/p>\n<\/td>\n<td>\n<p>408<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0434\u0432\u0443\u0445\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448. \u041f\u043e\u0439\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0421LUSTER \u043f\u0440\u044f\u043c\u043e \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u043c\u0443 \u043d\u0430\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0443:<\/p>\n<pre><code class=\"sql\">cluster test_read USING idx_test_read_user_id_created_at;<\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u221d IOPS)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>10<\/p>\n<\/td>\n<td>\n<p>5<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>100<\/p>\n<\/td>\n<td>\n<p>6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1000<\/p>\n<\/td>\n<td>\n<p>19<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 50-\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u043e IOPS.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u0442\u043e\u0438\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e CLUSTER \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0440\u043e\u043c\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b CLUSTER, \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u043d\u043d\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439<a href=\"https:\/\/reorg.github.io\/pg_repack\/\"> <u>pg_repack<\/u><\/a>.<\/p>\n<h2>\u041d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438<\/h2>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 UUID v4? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435.<\/p>\n<h2>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 UUID<\/h2>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c UUID, \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430. \u0422\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e, \u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0434\u043e\u043b\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 PostgreSQL: <a href=\"https:\/\/github.com\/tvondra\/sequential-uuids\"><u>tvondra\/sequential-uuids<\/u><\/a> \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/sequential-uuid-generators\/\"><u>2ndquadrant (\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u043b\u043e\u0433\u0435)<\/u><\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>postgres=# select uuid_time_nextval();           uuid_time_nextval --------------------------------------  2853857f-7563-4f06-92b1-9d10491e2854 (1 row)  postgres=# \\watch 0.1 Fri 25 Jun 2021 06:11:19 AM UTC (every 0.1s)            uuid_time_nextval --------------------------------------  28539092-f737-4bba-8036-7892e1ff9657 (1 row)  Fri 25 Jun 2021 06:11:19 AM UTC (every 0.1s)            uuid_time_nextval --------------------------------------  285399a9-a908-4310-b95a-a977d771ada2 (1 row)  Fri 25 Jun 2021 06:11:19 AM UTC (every 0.1s)            uuid_time_nextval --------------------------------------  28538529-0db4-4836-a002-341e912122ae (1 row)<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>ULID<\/h2>\n<p><a href=\"https:\/\/github.com\/ulid\/spec\"><u>\u0418\u0434\u0435\u044f<\/u><\/a> \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e, \u043d\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435:<\/p>\n<pre><code> 01AN4Z07BY      79KA1307SR9X4MV3  |----------|    |----------------|  Timestamp          Randomness   10chars            16chars    48bits             80bits<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0440\u0443\u0447\u0435\u043d\u0430&nbsp; \u043a\u0430\u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0442\u0430\u043a PostgreSQL.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 ULID \u043d\u0430 python-\u043a\u043b\u0438\u0435\u043d\u0442\u0435 \u0438 plpgsql<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">-- curl https:\/\/raw.githubusercontent.com\/geckoboard\/pgulid\/master\/pgulid.sql | psql  postgres=# select now(), generate_ulid();                now              |       generate_ulid  -------------------------------+----------------------------  2021-06-25 06:59:39.391656+00 | 01F90ZF2805C8GGXSA879VHWP5  postgres=# select now(), generate_ulid();              now              |       generate_ulid ------------------------------+---------------------------- 2021-06-25 06:59:39.84068+00 | 01F90ZF2P1BDGRW3JCXSAKK8CJ <\/code><\/pre>\n<pre><code class=\"python\"># pip3 install ulid-py  &gt;&gt;&gt; import ulid, time &gt;&gt;&gt; from datetime import datetime \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f ulid \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u0434\u0430\u0442\u0443 &gt;&gt;&gt; ulid.from_timestamp(datetime.strptime('2000\/01\/01 00:00:00', '%Y\/%m\/%d %H:%M:%S')) &lt;ULID('00VHN2NR40QBMGKSF91V5HRVXP')&gt; &gt;&gt;&gt; ulid.from_timestamp(datetime.strptime('2000\/01\/01 00:00:00', '%Y\/%m\/%d %H:%M:%S')) &lt;ULID('00VHN2NR40GFCHAMWYYW2MVYMC')&gt; \u043f\u0440\u043e\u0432\u043e\u0440\u043e\u0442 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435 \u0441\u043a\u043e\u0440\u043e :) &gt;&gt;&gt; ulid.from_timestamp(datetime.strptime('3000\/01\/01 00:00:00', '%Y\/%m\/%d %H:%M:%S')) &lt;ULID('0XHZCTG540KKD2KAYJP2ZMQFPM')&gt; <\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0438\u0437 ULID, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b plpgsql, # \u043c\u043e\u0436\u043d\u043e \u0441 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e ms  &gt;&gt;&gt; v = ulid.parse('01F90ZF2805C8GGXSA879VHWP5') &gt;&gt;&gt; print(v.timestamp().datetime); 2021-06-25 06:59:39.392000+00:00<\/code><\/pre>\n<pre><code class=\"python\"># ULID \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c \u0441 UUID  &gt;&gt;&gt; uuid.UUID(bytes=ulid.from_timestamp(time.time()).bytes) UUID('017a422e-2c1c-b378-ac7f-411bbe4d6714') &gt;&gt;&gt; uuid.UUID(bytes=ulid.from_timestamp(time.time()).bytes) UUID('017a422e-2e3d-4e8d-84fa-c63b21462531')<\/code><\/pre>\n<pre><code class=\"python\"># UUID \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 ULID  &gt;&gt;&gt; ulid.from_uuid(uuid.UUID('017a422e-2c1c-b378-ac7f-411bbe4d6714')) &lt;ULID('01F912WB0WPDWARZT13EZ4TSRM')&gt; &gt;&gt;&gt; ulid.from_uuid(uuid.UUID('017a422e-2e3d-4e8d-84fa-c63b21462531')) &lt;ULID('01F912WBHX9T6R9YP67CGMC99H')&gt; <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 seq UUID:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 wrap around \u0432 \u043e\u0431\u043e\u0437\u0440\u0438\u043c\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437 ULID \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0431\u044b\u043b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c ULID \u0441 UUID, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0439 \u0437\u0430\u043c\u0435\u043d\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c<\/h2>\n<details class=\"spoiler\">\n<summary>\u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">-- bigserial CREATE TABLE test_serial (     id bigserial PRIMARY KEY,     created_at timestamp DEFAULT current_timestamp );  -- uuid v4 CREATE TABLE test_uuid (     id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),     created_at timestamp DEFAULT current_timestamp );  -- ulid CREATE TABLE test_ulid (     id uuid PRIMARY KEY DEFAULT generate_ulid(),     created_at timestamp DEFAULT current_timestamp );  -- uuid CREATE TABLE test_sequential_uuid_timestamp (     id uuid PRIMARY KEY DEFAULT uuid_time_nextval(interval_length := 60, interval_count := 65536),     created_at timestamp DEFAULT current_timestamp ); <\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0438 \u0441\u043a\u0440\u0438\u043f\u0442 pgbench:<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">BEGIN;   INSERT INTO :TEST_TABLE (created_at) values (current_timestamp); END; <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/886\/b26\/b05\/886b26b051f1755ef7b59dc46c425fa2.png\" width=\"2079\" height=\"834\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u0443\u044e \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u043d\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u0440\u0430\u0441\u0442\u0451\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 dataset (\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445 INSERT). \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0442\u044c buffer pool \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 dataset, \u0438 \u0443 \u043d\u0430\u0441 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u043e\u0431\u0449\u0438\u0439 IOPS \u0437\u0430 \u0441\u0447\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u043d\u0435 \u0443\u043f\u0440\u0451\u0442\u0441\u044f \u0432 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 uuid \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 WAL:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/553\/1a8\/abb\/5531a8abb451a7b441fd146e1c3bd137.png\" alt=\"\u041f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 WAL \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0442\u0430\u0442\u044c\" title=\"\u041f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 WAL \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0442\u0430\u0442\u044c\" width=\"2100\" height=\"834\"><figcaption>\u041f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 WAL \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0438\u0442\u0430\u0442\u044c<\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 UUID \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u043a\u0430\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u0441\u043a \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c (\u043e\u0434\u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u2013 \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430), \u0435\u0451 \u043d\u0430\u0434\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440. \u0422\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u2013 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0440\u0430\u0444\u0438\u043a\u0438 \u043f\u043e IOPS<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5b9\/50a\/01c\/5b950a01c79f79448c996ee4ab2d3374.png\" alt=\"\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0434\u0438\u0441\u043a \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\" title=\"\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0434\u0438\u0441\u043a \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\" width=\"3686\" height=\"1146\"><figcaption>\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0434\u0438\u0441\u043a \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6f9\/119\/ee4\/6f9119ee4061c71f54c5c97d8ae6c5cc.png\" alt=\"\u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0438\u0441\u043a \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435\" title=\"\u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0438\u0441\u043a \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435\" width=\"3692\" height=\"1106\"><figcaption>\u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0438\u0441\u043a \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435<\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u2013 \u044d\u0442\u043e IOPS.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8e4\/3cf\/ab0\/8e43cfab0b719ba7f155ebe8f027c98a.png\" alt=\"\u041f\u0440\u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 INSERT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0430\" title=\"\u041f\u0440\u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 INSERT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0430\" width=\"800\" height=\"737\"><figcaption>\u041f\u0440\u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 INSERT \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/figcaption><\/figure>\n<h2>\u0411\u043e\u043d\u0443\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ULID<\/h2>\n<p>\u0425\u043e\u0442\u0435\u043b \u0431\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0431\u043e\u043d\u0443\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 ULID \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439<a href=\"https:\/\/github.com\/geckoboard\/pgulid\/blob\/master\/pgulid.sql\"> <u>generate_ulid<\/u><\/a>:<\/p>\n<details class=\"spoiler\">\n<summary>\u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f generate_ulid<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE OR REPLACE FUNCTION generate_ulid(at_in timestamptz default current_timestamp, entropy_in bool default true) RETURNS TEXT AS $$ DECLARE   -- Crockford's Base32   encoding   BYTEA = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';   timestamp  BYTEA = E'\\\\000\\\\000\\\\000\\\\000\\\\000\\\\000';   output     TEXT = '';    unix_time  BIGINT;   ulid       BYTEA; BEGIN   -- 6 timestamp bytes   unix_time = (EXTRACT(EPOCH FROM at_in) * 1000)::BIGINT;   timestamp = SET_BYTE(timestamp, 0, (unix_time &gt;&gt; 40)::BIT(8)::INTEGER);   timestamp = SET_BYTE(timestamp, 1, (unix_time &gt;&gt; 32)::BIT(8)::INTEGER);   timestamp = SET_BYTE(timestamp, 2, (unix_time &gt;&gt; 24)::BIT(8)::INTEGER);   timestamp = SET_BYTE(timestamp, 3, (unix_time &gt;&gt; 16)::BIT(8)::INTEGER);   timestamp = SET_BYTE(timestamp, 4, (unix_time &gt;&gt; 8)::BIT(8)::INTEGER);   timestamp = SET_BYTE(timestamp, 5, unix_time::BIT(8)::INTEGER);    -- 10 entropy bytes   ulid = timestamp || gen_random_bytes(10);    -- Encode the timestamp   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 0) &amp; 224) &gt;&gt; 5));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 0) &amp; 31)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 1) &amp; 248) &gt;&gt; 3));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 1) &amp; 7) &lt;&lt; 2) | ((GET_BYTE(ulid, 2) &amp; 192) &gt;&gt; 6)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 2) &amp; 62) &gt;&gt; 1));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 2) &amp; 1) &lt;&lt; 4) | ((GET_BYTE(ulid, 3) &amp; 240) &gt;&gt; 4)));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 3) &amp; 15) &lt;&lt; 1) | ((GET_BYTE(ulid, 4) &amp; 128) &gt;&gt; 7)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 4) &amp; 124) &gt;&gt; 2));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 4) &amp; 3) &lt;&lt; 3) | ((GET_BYTE(ulid, 5) &amp; 224) &gt;&gt; 5)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 5) &amp; 31)));  if entropy_in then   -- Encode the entropy   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 6) &amp; 248) &gt;&gt; 3));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 6) &amp; 7) &lt;&lt; 2) | ((GET_BYTE(ulid, 7) &amp; 192) &gt;&gt; 6)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 7) &amp; 62) &gt;&gt; 1));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 7) &amp; 1) &lt;&lt; 4) | ((GET_BYTE(ulid, 8) &amp; 240) &gt;&gt; 4)));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 8) &amp; 15) &lt;&lt; 1) | ((GET_BYTE(ulid, 9) &amp; 128) &gt;&gt; 7)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 9) &amp; 124) &gt;&gt; 2));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 9) &amp; 3) &lt;&lt; 3) | ((GET_BYTE(ulid, 10) &amp; 224) &gt;&gt; 5)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 10) &amp; 31)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 11) &amp; 248) &gt;&gt; 3));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 11) &amp; 7) &lt;&lt; 2) | ((GET_BYTE(ulid, 12) &amp; 192) &gt;&gt; 6)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 12) &amp; 62) &gt;&gt; 1));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 12) &amp; 1) &lt;&lt; 4) | ((GET_BYTE(ulid, 13) &amp; 240) &gt;&gt; 4)));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 13) &amp; 15) &lt;&lt; 1) | ((GET_BYTE(ulid, 14) &amp; 128) &gt;&gt; 7)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 14) &amp; 124) &gt;&gt; 2));   output = output || CHR(GET_BYTE(encoding, ((GET_BYTE(ulid, 14) &amp; 3) &lt;&lt; 3) | ((GET_BYTE(ulid, 15) &amp; 224) &gt;&gt; 5)));   output = output || CHR(GET_BYTE(encoding, (GET_BYTE(ulid, 15) &amp; 31))); else   output = output || '0000000000000000'; end if;    RETURN output; END $$ LANGUAGE plpgsql VOLATILE;<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438:<\/p>\n<pre><code class=\"sql\">CREATE TABLE \"table\" (   id text primary key not null default generate_ulid(now(), true),   created_at timestamptz default current_timestamp,   ... ) partition by range (id);  CREATE TABLE table_2021 partition of \"table\" for values   from (generate_ulid('2021-01-01', false))   to (generate_ulid('2022-01-01', false));<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f generate_ulid() \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 ULID, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043f\u0440\u0430\u0432\u043e \u043d\u0430\u0432\u0435\u0441\u0438\u0442\u044c constraint:<\/p>\n<pre><code>alter table table_2021 add constraint created_at_2021   check (created_at &gt;= '2021-01-01' and created_at &lt; '2022-01-01');<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043b\u0430\u043d\u0435\u0440\u0443 \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u043a\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043f\u0441\u0435\u0432\u0434\u043e-\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 primary index \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 (\u0432 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 PK) \ud83d\ude42<\/p>\n<h2>\u041d\u0430\u0443\u0447\u0438\u0442\u0435 \u0432\u0430\u0448 PostgreSQL \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u2013 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430\u043c, \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0447\u0438\u0445, \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0447\u0438\u0441\u0442\u044b\u0439 \u0440\u0430\u043d\u0434\u043e\u043c, \u043f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c. \u042d\u0442\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043b\u0435\u0436\u0430\u043b\u0438 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u044f\u0434\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 user_id, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0438\u0436\u0435 \u0434\u0440\u0443\u0433 \u043a \u0434\u0440\u0443\u0433\u0443. \u0414\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043d\u0430 \u043e\u0434\u043d\u0443 heap-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0438 \u0441\u0138\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0434\u0435\u0138\u0441\u0430 \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0434\u0432\u0435 \u0441\u0442\u0440\u043e\u0447\u0138\u0438, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c IOPS \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430.<\/p>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u2013 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/13\/sql-cluster\"> <u>CLUSTER<\/u><\/a> (\u0432 \u043c\u043e\u043d\u043e\u043f\u043e\u043b\u044c\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435) \u0438\u043b\u0438<a href=\"https:\/\/reorg.github.io\/pg_repack\/\"> <u>pg_repack<\/u><\/a> (\u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u0435\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0435\u0439).<\/p>\n<p>\u0417\u043d\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0443\u0441\u043f\u0435\u0445\u043e\u0432 \u0432\u0430\u043c \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438 \u0432 \u0431\u043e\u0440\u044c\u0431\u0435 \u0441 \u0442\u043e\u0440\u043c\u043e\u0437\u0430\u043c\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0436\u0438\u0432\u0438\u0442\u0435 \u0440\u043e\u0432\u043d\u043e!<\/p>\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\/ozontech\/blog\/564520\/\"> https:\/\/habr.com\/ru\/company\/ozontech\/blog\/564520\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p>&#171;\u0425\u043e\u0447\u0435\u0448\u044c \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043f\u043e\u0441\u0442\u0440\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441&#187; \u2013 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433 \u043f\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 PostgreSQL. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0432 PostgreSQL \u0435\u0441\u0442\u044c, \u043d\u043e \u0442\u043e\u0440\u043c\u043e\u0437\u0430 \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0438\u0441\u044c. \u041d\u0435 \u0432\u0441\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u0440\u0438\u0447\u0438\u043d \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u2013 \u044d\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2013 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c.<\/p>\n<figure class=\"full-width\"><figcaption>\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/figcaption><\/figure>\n<h2>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>\u0412 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 pg_stats \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 correlation. \u0412<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/13\/view-pg-stats\"> <u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/u><\/a> \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e \u044d\u0442\u043e <em>&#171;\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0441\u0442\u0440\u043e\u043a \u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u0430&#187;<\/em>.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"sql\">CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"; CREATE TABLE example (corr, uncorr) AS    SELECT i, uuid_generate_v4()    FROM generate_series(1, 100000) AS i; ANALYZE example;<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u043b\u044e corr \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u043d\u0438\u044e, \u0430 \u043f\u043e \u043f\u043e\u043b\u044e uncorr \u2013 \u0441\u043e\u0432\u0441\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e:<\/p>\n<pre><code class=\"sql\">select correlation from pg_stats where tablename = 'example' and attname = 'corr'; -[ RECORD 1 ]-- correlation | 1  select correlation from pg_stats where tablename = 'example' and attname = 'uncorr'; -[ RECORD 1 ]-------------- correlation | -0.0013047641<\/code><\/pre>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c\u0441\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 correlation \u0431\u043b\u0438\u0437\u043a\u0430 \u043a 1 \u0438\u043b\u0438 -1 \u2013 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0410 \u0434\u0430\u043d\u043d\u044b\u0435, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f \u0431\u043b\u0438\u0437\u043a\u0430 \u043a \u043d\u0443\u043b\u044e \u2013 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438.<\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u044b. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u0438\u043d\u0434\u0435\u043a\u0441. <\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u0435\u0449\u0430\u0445 \u043d\u0430\u0441\u0447\u0451\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b PostgreSQL \u0445\u0440\u0430\u043d\u0438\u0442 \u0432 \u0431\u043b\u043e\u043a\u0430\u0445, \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0431\u043b\u043e\u043a\u0430, PostgreSQL \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0448\u0435\u0442 \u0431\u043b\u043e\u043a \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e (<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/9.6\/runtime-config-wal#guc-full-page-writes\"><u>\u0441 \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u043e\u0439<\/u><\/a>).<\/p>\n<\/li>\n<li>\n<p>\u041b\u044e\u0431\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0431\u043b\u043e\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0411\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 (Buffer Manager), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u0431\u043b\u043e\u043a\u0438 \u0432 \u0411\u0443\u0444\u0435\u0440\u043d\u043e\u043c \u043a\u044d\u0448\u0435 (Buffer pool). \u0427\u0442\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 (\u0431\u0430\u043a\u0435\u043d\u0434\u0443), \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u0432 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u043c \u043a\u044d\u0448\u0435. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0442\u044c &#171;\u0433\u0440\u044f\u0437\u043d\u0443\u044e&#187; (\u043d\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441 \u0434\u0438\u0441\u043a\u043e\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443) \u0431\u0430\u043a\u0435\u043d\u0434\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430 \u0434\u0438\u0441\u043a.<\/p>\n<\/li>\n<li>\n<p>B-Tree \u0445\u0440\u0430\u043d\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 ctid (\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445). \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 ctid \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0446\u0438\u0444\u0440: Block \u0438 Number. \u0422\u0443\u0442 Block \u2013 \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u043b\u043e\u043a 0 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 0-8kB, \u0430 \u0431\u043b\u043e\u043a 10 \u2013 \u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 80kB-88kB. Number \u2013 \u044d\u0442\u043e \u043d\u043e\u043c\u0435\u0440 &#171;\u0441\u0442\u0440\u043e\u043a\u0438&#187; \u0432 \u0431\u043b\u043e\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0434\u0435\u043a\u0441\u044b PostgreSQL \u043d\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432 ctid, \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 Heap Fetches \u0432 explain, \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 <a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/326096\/\"><u>\u0442\u0443\u0442<\/u><\/a>).<\/p>\n<\/li>\n<\/ul>\n<h2>\u0420\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b<\/h2>\n<p>\u0421\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u043d\u0430 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043e\u0433\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u043b\u0435\u043a\u043e, \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, &#8216;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa&#8217;::uuid \u0438 &#8216;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaab&#8217;::uuid \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e (\u043e\u043a\u043e\u043b\u043e 99.9%) \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u044b \u0445\u0430\u043e\u0442\u0438\u0447\u043d\u043e \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u0430\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a 21:<\/p>\n<pre><code class=\"sql\">CREATE INDEX corr_idx ON example (corr); CREATE INDEX uncorr_idx ON example (uncorr); ANALYZE example;  CREATE EXTENSION IF NOT EXISTS pageinspect;  -- \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0431\u043b\u043e\u043a 21 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u2013 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043b\u0438\u0441\u0442 btree-\u0438\u043d\u0434\u0435\u043a\u0441\u0430 (l) SELECT corr.type, uncorr.type FROM bt_page_stats('corr_idx', 21) as corr, bt_page_stats('uncorr_idx', 21) as uncorr;  type | type ------+------  l    | l  -- \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c index items \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e ctid: (block, item) SELECT bt.ctid as corr_heap_ctid, e.corr, e.uncorr FROM bt_page_items('uncorr_idx', 21) as bt INNER JOIN example e on e.ctid = bt.ctid LIMIT 5 OFFSET 1;  corr_heap_ctid | corr  |                uncorr ----------------+-------+--------------------------------------  (5,77)         |   862 | 0cc6e023-8c62-4a89-a066-d3879c99667d  (227,155)      | 35794 | 0cc83303-ab36-4cb7-8f02-48ac8d1c22e4  (158,92)       | 24898 | 0cc93ffe-b54d-4d81-b7da-946aac5e9268  (177,10)       | 27799 | 0cc943c6-6551-45d9-ad02-69331a76773d  (98,136)       | 15522 | 0cca5867-9c1c-43e2-95fa-a5479e4a39cd  -- \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 SELECT bt.ctid as corr_heap_ctid, e.corr, e.uncorr FROM bt_page_items('corr_idx', 21) as bt INNER JOIN example e on e.ctid = bt.ctid LIMIT 5 OFFSET 1;  corr_heap_ctid | corr |                uncorr ----------------+------+--------------------------------------  (44,47)        | 6955 | 99e1675e-d402-4413-90cf-79c7b4bad88d  (44,48)        | 6956 | 3dd37835-8c24-4f13-b284-e533763cb65d  (44,49)        | 6957 | 1a18c970-f294-4a97-a31d-fae556c70be5  (44,50)        | 6958 | fbbb36ce-93c0-4068-9e0a-a3d367cc725c  (44,51)        | 6959 | d72c1154-23d3-4544-87b3-d7038c5be31b<\/code><\/pre>\n<p>\u0412 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0431\u043b\u043e\u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0441\u0442\u0430\u0442\u0438, \u0434\u043b\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL \u0431\u044b\u043b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d<a href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/346460\/\"> <u>BRIN<\/u><\/a>-\u0438\u043d\u0434\u0435\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e, \u0447\u0435\u043c B-Tree.<\/p>\n<p>\u0412 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e &#171;\u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435&#187; (\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435) \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.<\/p>\n<figure class=\"\"><figcaption>\u041e\u0434\u0438\u043d \u0431\u043b\u043e\u043a \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435<\/figcaption><\/figure>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430<\/h2>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430:<\/p>\n<ul>\n<li>\n<p>\u041d\u0438\u0437\u043a\u0438\u0439 page hit (\u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430) \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430: \u043d\u0435\u0442 &#171;\u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439&#187;, \u0442\u0430\u043a\u0438\u0445, \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0434\u043d\u044f \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 heap \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0438\u043d\u0434\u0435\u043a\u0441\u0435, \u0435\u0441\u043b\u0438  \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f bitmap heap scan.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0440\u043e\u0433\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430: \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a reindex\/vacuum, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0443\u0444\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u044d\u0448\u0430.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><figcaption>\u0421 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0430 &#171;\u0433\u043e\u0440\u044f\u0447\u0443\u044e&#187; \u0438 &#171;\u0445\u043e\u043b\u043e\u0434\u043d\u0443\u044e&#187; \u0447\u0430\u0441\u0442\u044c. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 buffer pool (\u0431\u0443\u0444\u0435\u0440\u043d\u044b\u0439 \u043a\u044d\u0448) \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044e IOPS<\/figcaption><\/figure>\n<h2>\u041d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0438<\/h2>\n<p>\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u2013 \u044d\u0442\u043e UUID v4, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u0447\u0430\u0449\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043c\u0435\u043d\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u0438\u043f\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445: int, varchar. \u041f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u043d\u0430\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439, \u043d\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"sql\">CREATE TABLE test_read (     id bigserial primary key,     user_id int not null,     created_at timestamptz not null default current_timestamp,     value int ); CREATE INDEX idx_test_read_user_id_created_at on test_read (user_id, created_at desc);<\/code><\/pre>\n<p>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"sql\">\\set user_id random(1, 2000) begin;  insert into test_read (user_id) values (:user_id); end;<\/code><\/pre>\n<p>\u041d\u0430\u0447\u043d\u0451\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u2013 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 N-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:<\/p>\n<pre><code class=\"sql\">explain (analyze,buffers) select value from test_read where user_id = 200 order by created_at limit 1000;                                                                                QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------  Limit  (cost=0.57..3883.09 rows=1000 width=12) (actual time=0.044..1.769 rows=1000 loops=1)    Buffers: shared hit=969    -&gt;  Index Scan Backward using idx_test_read_user_id_created_at on test_read  (cost=0.57..252547.29 rows=65047 width=12) (actual time=0.042..1.664 rows=1000 loops=1)          Index Cond: (user_id = 200)          Buffers: shared hit=969<\/code><\/pre>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0441 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u0441\u043e\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e IOPS), \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0441\u0442\u0440\u043e\u0447\u0435\u043a:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u221d<\/strong> <strong>IOPS)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>10<\/p>\n<\/td>\n<td>\n<p>14<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>100<\/p>\n<\/td>\n<td>\n<p>100<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1000<\/p>\n<\/td>\n<td>\n<p>969<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u044d\u0442\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u0430\u043a \u043c\u044b \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<a href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/13\/sql-cluster\"> <u>CLUSTER<\/u><\/a>:<\/p>\n<pre><code class=\"sql\">cluster test_read using test_read_user_id_idx;<\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u221d IOPS)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>10<\/p>\n<\/td>\n<td>\n<p>11<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>100<\/p>\n<\/td>\n<td>\n<p>53<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1000<\/p>\n<\/td>\n<td>\n<p>408<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u043e\u0447\u0442\u0438 \u0434\u0432\u0443\u0445\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448. \u041f\u043e\u0439\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0421LUSTER \u043f\u0440\u044f\u043c\u043e \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0435\u043c\u0443 \u043d\u0430\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0443:<\/p>\n<pre><code class=\"sql\">cluster test_read USING idx_test_read_user_id_created_at;<\/code><\/pre>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>\u043a\u043e\u043b-\u0432\u043e \u0431\u0443\u0444\u0435\u0440\u043e\u0432 (\u221d IOPS)<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>10<\/p>\n<\/td>\n<td>\n<p>5<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>100<\/p>\n<\/td>\n<td>\n<p>6<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>1000<\/p>\n<\/td>\n<td>\n<p>19<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 50-\u043a\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u043e IOPS.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u0442\u043e\u0438\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e CLUSTER \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041a\u0440\u043e\u043c\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b CLUSTER, \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0435\u0449\u0451 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u043e\u043d\u043d\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439<a href=\"https:\/\/reorg.github.io\/pg_repack\/\"> <u>pg_repack<\/u><\/a>.<\/p>\n<h2>\u041d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0438 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438<\/h2>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c, \u043a\u0430\u043a \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 UUID v4? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435.<\/p>\n<h2>\u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 UUID<\/h2>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c UUID, \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u0430\u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430. \u0422\u043e\u0433\u0434\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u043e, \u0438 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0434\u043e\u043b\u0435\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 PostgreSQL: <a href=\"https:\/\/github.com\/tvondra\/sequential-uuids\"><u>tvondra\/sequential-uuids<\/u><\/a> \u043e\u0442 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <a href=\"https:\/\/www.2ndquadrant.com\/en\/blog\/sequential-uuid-generators\/\"><u>2ndquadrant (\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0431\u043b\u043e\u0433\u0435)<\/u><\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0439 \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>postgres=# select uuid_time_nextval();           uuid_time_nextval --------------------------------------  2853857f-7563-4f06-92b1-9d10491e2854 (1 row)  postgres=# \\watch 0.1 Fri 25 Jun 2021 06:11:19 AM UTC (every 0.1s)            uuid_time_nextval --------------------------------------  28539092-f737-4bba-8036-7892e1ff9657 (1 row)  Fri 25 Jun 2021 06:11:19 AM UTC (every 0.1s)            uuid_time_nextval --------------------------------------  285399a9-a908-4310-b95a-a977d771ada2 (1 row)  Fri 25 Jun 2021 06:11:19 AM UTC (every 0.1s)    <\/code><\/pre>\n<\/div>\n<\/details>\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-326030","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326030","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=326030"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/326030\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=326030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=326030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=326030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}