{"id":79039,"date":"2020-04-23T19:43:26","date_gmt":"2020-04-23T17:43:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql"},"modified":"2020-04-23T19:43:26","modified_gmt":"2020-04-23T17:43:26","slug":"ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"Sparer penger p\u00e5 store volum i PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Fortsett med temaet for registrering av store datastreamer, tatt opp <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">i den forrige artikkelen om partisjonering<\/a><\/noindex>, her ser vi p\u00e5 metodene for \u00e5 <b>redusere den \u00abfysiske\u00bb st\u00f8rrelsen p\u00e5 lagret<\/b> i PostgreSQL, og deres innvirkning p\u00e5 serverytelsen.<\/p>\n<p>Det vil bli snakk om <b>TOAST-innstillinger og datalignering<\/b>. \u00abI gjennomsnitt\u00bb vil disse metodene ikke spare s\u00e5 mye ressurser, men \u2014 helt uten modifikasjon av applikasjonskoden.<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLikevel, v\u00e5r erfaring har vist seg \u00e5 v\u00e6re ganske produktiv p\u00e5 dette omr\u00e5det, ettersom lagringsl\u00f8sningen for nesten all overv\u00e5king i sin natur er <b>for det meste append-only<\/b> n\u00e5r det gjelder de innspilte dataene. Og hvis du er interessert i hvordan du kan l\u00e6re databasen \u00e5 skrive til disk i stedet for <b>200MB\/s<\/b> halvparten s\u00e5 mye \u2014 vennligst les videre.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Sm\u00e5 hemmeligheter om store data<\/h2>\n<p>\nI profileringen av <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">tjenesten v\u00e5r<\/a><\/noindex>, f\u00e5r den regelmessig tekstpakker <b>fra loggene<\/b>.<\/p>\n<p>Og siden <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">SBIS-systemet<\/a><\/noindex>, hvis databaser vi overv\u00e5ker, er et flerfaglig produkt med komplekse datamodeller, er foresp\u00f8rslene <b>for \u00e5 oppn\u00e5 maksimal ytelse<\/b> helt klart <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">\u00abflermoduls\u00bb med komplisert algoritmisk logikk<\/a><\/noindex>. S\u00e5 st\u00f8rrelsen p\u00e5 hver enkelt foresp\u00f8rsel eller den resulterende utf\u00f8relsesplanen i loggene som kommer til oss viser seg \u00e5 v\u00e6re \u00abi gjennomsnitt\u00bb ganske stor.<\/p>\n<p>La oss ta en titt p\u00e5 strukturen til en av tabellene hvor vi skriver \u00abr\u00e5\u00bb data \u2014 det vil si, den originale teksten fra loggoppf\u00f8ringen:<\/p>\n<pre><code class=\"sql\">CREATE TABLE rawdata_orig(\n  pack -- PK\n    uuid NOT NULL\n, recno -- PK\n    smallint NOT NULL\n, dt -- partisjonsn\u00f8kkel\n    date\n, data -- det viktigste\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nEn typisk tabell (allerede partisjonert, selvf\u00f8lgelig, s\u00e5 dette er en mal for partisjonen), der det viktigste er teksten. Noen ganger ganske omfattende.<\/p>\n<p>La oss huske at den \u00abfysiske\u00bb st\u00f8rrelsen p\u00e5 en post i PG ikke kan ta mer enn \u00e9n datakilde, men den \u00ablogiske\u00bb st\u00f8rrelsen er helt forskjellig. For \u00e5 skrive en stor verdi i et felt (varchar\/text\/bytea) brukes <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">TOAST-teknologi<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL bruker en fast sidestr\u00f8rrelse (vanligvis 8 KB), og tillater ikke at tupler opptar flere sider. Derfor er det ikke mulig \u00e5 lagre veldig store feltverdier direkte. For \u00e5 omg\u00e5 denne begrensningen komprimeres og\/eller deles store feltverdier opp i flere fysiske rader. Dette skjer usynlig for brukeren og p\u00e5virker for det meste serverkoden lite. Denne metoden er kjent som TOAST \u2026<\/p><\/blockquote>\n<p>\nFaktisk, for hver tabell med \"potensielt store\" felt, opprettes automatisk <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">en tilknyttede tabell med \"skiver\"<\/a><\/noindex> av hver \"stor\" post i segmenter p\u00e5 2KB:<\/p>\n<pre><code class=\"sql\">TOAST(\n  chunk_id\n    integer\n, chunk_seq\n    integer\n, chunk_data\n    bytea\n, PRIMARY KEY(chunk_id, chunk_seq)\n);<\/code><\/pre>\n<p>\nDet vil si, hvis vi m\u00e5 skrive en rad med et \"stort\" verdi <code>data<\/code>, vil den faktiske innspillingen skje <b>ikke bare i hovedtabellen og dens PK, men ogs\u00e5 i TOAST og dens PK<\/b>.<\/p>\n<h4>Redusere TOAST-p\u00e5virkningen<\/h4>\n<p>\nMen de fleste postene v\u00e5re er likevel ikke s\u00e5 store, <b>de burde passe inn i 8KB<\/b> \u2014 hvordan kan vi spare p\u00e5 dette?..<\/p>\n<p>Her kommer attributtet <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> til hjelp i tabellkolonnen:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> tillater b\u00e5de komprimering og separat lagring. Dette er <b>standardalternativet<\/b> for de fleste datatyper som er kompatible med TOAST. F\u00f8rst fors\u00f8kes det \u00e5 komprimere, deretter - \u00e5 lagre utenfor tabellen, hvis raden fortsatt er for stor.<\/li>\n<li><b>MAIN<\/b> tillater komprimering, men ikke separat lagring. (Faktisk vil separat lagring likevel bli utf\u00f8rt for slike kolonner, men bare <b>som en siste utvei<\/b>, n\u00e5r det ikke er andre m\u00e5ter \u00e5 redusere raden s\u00e5 den f\u00e5r plass p\u00e5 siden.)<\/li>\n<\/ul>\n<\/blockquote>\n<p>Faktisk er dette akkurat det vi trenger for tekst \u2013 <b>komprimere maksimalt, og hvis det absolutt ikke f\u00e5r plass \u2013 flytte til TOAST<\/b>. Dette kan gj\u00f8res direkte \"on the fly\", med \u00e9n kommando:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/code><\/pre>\n<p><\/p>\n<h4>Hvordan vurdere effekten<\/h4>\n<p>\nSiden datatroppene endres hver dag, kan vi ikke sammenligne absolutte tall, men relativt jo <b>mindre andel<\/b> vi har skrevet til TOAST \u2013 jo bedre. Men det er en fare \u2013 jo st\u00f8rre \"fysisk\" volum av hver enkelt post, jo \"bredere\" blir indeksen, fordi man m\u00e5 dekke flere datalagsider.<\/p>\n<p>Seksjon <b>f\u00f8r endringer<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)\n<\/code><\/pre>\n<p>\nSeksjon <b>etter endringer<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/code><\/pre>\n<p>\nFaktisk <b>har vi begynt \u00e5 skrive til TOAST 2 ganger sjeldnere<\/b>, som lettet ikke bare disken, men ogs\u00e5 CPU-en:<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJeg bemerker at vi ogs\u00e5 \u00ableser\u00bb disken mindre, og ikke bare \u00abskriver\u00bb \u2014 fordi n\u00e5r vi setter inn en post i en tabell, m\u00e5 vi \u00ablese\u00bb ogs\u00e5 en del av treet til hver av indeksene for \u00e5 fastsl\u00e5 dens fremtidige posisjon i dem.<\/p>\n<h2>Hvem har det bra med PostgreSQL 11<\/h2>\n<p>\nEtter oppdateringen til PG11 bestemte vi oss for \u00e5 fortsette med \u00abtuning\u00bb av TOAST og la merke til at fra denne versjonen er parameteren blitt tilgjengelig for innstilling <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/11\/storage-toast#STORAGE-TOAST-ONDISK\"><code>toast_tuple_target<\/code><\/a><\/noindex>:<\/p>\n<blockquote><p>TOAST-behandlingskoden aktiveres bare n\u00e5r verdien av raden som skal lagres i tabellen, er st\u00f8rre enn TOAST_TUPLE_THRESHOLD byte (vanligvis 2 Kb). TOAST-koden vil komprimere og\/eller flytte feltverdier utenfor tabellen inntil verdien av raden er mindre enn TOAST_TUPLE_TARGET byte (variabel st\u00f8rrelse, ogs\u00e5 vanligvis 2 Kb) eller reduksjon av volumet ikke lenger er mulig.<\/p><\/blockquote>\n<p>Vi konkluderte med at dataene v\u00e5re vanligvis enten er \u00abganske korte\u00bb eller umiddelbart \u00abveldig lange\u00bb, s\u00e5 vi bestemte oss for \u00e5 begrense oss til den minimal-mulige verdien:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nLa oss se hvordan de nye innstillingene p\u00e5virket diskbelastningen etter omkonfigurering:<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIkke verst! Gjennomsnittlig <b>diskk\u00f8 redusert<\/b> med omtrent 1,5 ganger, og \u00abbelegg\u00bb p\u00e5 disken har g\u00e5tt ned med 20%! Men kan det ha p\u00e5virket CPU-en p\u00e5 noen m\u00e5te?<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI det minste har det definitivt ikke blitt verre. Selv om det er vanskelig \u00e5 bed\u00f8mme, hvis selv slike volumer fortsatt ikke kan l\u00f8fte den gjennomsnittlige CPU-belastningen over <b>5%<\/b>.<\/p>\n<h2>Fra bytte av plass p\u00e5 leddene endres summen!<\/h2>\n<p>\nSom kjent sparer en kopeck en rubel, og med v\u00e5re lagringsvolumer p\u00e5 omtrent <b>10TB\/m\u00e5ned<\/b> kan selv en liten optimalisering gi god profitt. Derfor la vi merke til den fysiske strukturen av v\u00e5re data \u2014 hvordan spesifikt <b>felt blir \u00abpakket\u00bb inn i hver post<\/b> i hver tabell.<\/p>\n<p>Fordi p\u00e5 grunn av <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">datajustering<\/a><\/noindex> dette direkte <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">p\u00e5virker det resulterende volumet.<\/a><\/noindex>:<\/p>\n<blockquote><p>Mange arkitekturer forutsetter justering av data ved grensen av registerst\u00f8rrelser. For eksempel, p\u00e5 et 32-bits x86-system vil heltall (type integer, tar 4 byte) bli justert til en grense for 4-byte ord, s\u00e5 vel som dobbelt presisjon flyttall (type double precision, 8 byte). Og p\u00e5 et 64-bits system vil verdiene for double bli justert ved grensen for 8-byte ord. Dette er enda en grunn til inkompatibilitet.<\/p>\n<p>P\u00e5 grunn av justeringen av tabellraden avhenger st\u00f8rrelsen av rekkef\u00f8lgen p\u00e5 feltene. Vanligvis er denne effekten ikke s\u00e5 merkbar, men i noen tilfeller kan det f\u00f8re til en betydelig \u00f8kning i st\u00f8rrelsen. For eksempel, hvis man plasserer feltene av typene char(1) og integer om hverandre, vil det vanligvis mangle 3 byte mellom dem.<\/p><\/blockquote>\n<p>\nLa oss starte med syntetiske modeller:<\/p>\n<pre><code class=\"sql\">SELECT pg_column_size(ROW(\n  '0000-0000-0000-0000-0000-0000-0000-0000'::uuid\n, 0::smallint\n, '2019-01-01'::date\n));\n-- 48 byte\n\nSELECT pg_column_size(ROW(\n  '2019-01-01'::date\n, '0000-0000-0000-0000-0000-0000-0000-0000'::uuid\n, 0::smallint\n));\n-- 46 byte<\/code><\/pre>\n<p>\nHvor kom de ekstra byte fra i det f\u00f8rste tilfellet? Det er enkelt \u2013 <b>den 2-byte smallint justeres til en 4-byte grense<\/b> f\u00f8r det neste feltet, og n\u00e5r det kommer sist, er det ingenting \u00e5 justere.<\/p>\n<p>I teorien er alt bra og man kan flytte p\u00e5 feltene som man vil. La oss teste med virkelige data med et eksempel fra en av tabellene, hvor den daglige seksjonen tar 10-15GB.<\/p>\n<p>Den opprinnelige strukturen:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- Arvet fra tabell plan:  pack uuid NOT NULL,\n-- Arvet fra tabell plan:  recno smallint NOT NULL,\n-- Arvet fra tabell plan:  host uuid,\n-- Arvet fra tabell plan:  ts timestamp with time zone,\n-- Arvet fra tabell plan:  exectime numeric(32,3),\n-- Arvet fra tabell plan:  duration numeric(32,3),\n-- Arvet fra tabell plan:  bufint bigint,\n-- Arvet fra tabell plan:  bufmem bigint,\n-- Arvet fra tabell plan:  bufdsk bigint,\n-- Arvet fra tabell plan:  apn uuid,\n-- Arvet fra tabell plan:  ptr uuid,\n-- Arvet fra tabell plan:  dt date,\n  CONSTRAINT plan_20190220_pkey PRIMARY KEY (pack, recno),\n  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),\n  CONSTRAINT plan_20190220_dt_check CHECK (dt = '2019-02-20'::date)\n)\nINHERITS (public.plan)<\/code><\/pre>\n<p>\nSeksjonen etter endring av rekkef\u00f8lgen p\u00e5 kolonnene \u2013 er akkurat <b>de samme feltene, bare i en annen rekkef\u00f8lge.<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- Arvet fra tabell plan:  dt date NOT NULL,\n-- Arvet fra tabell plan:  ts timestamp with time zone,\n-- Arvet fra tabell plan:  pack uuid NOT NULL,\n-- Arvet fra tabell plan:  recno smallint NOT NULL,\n-- Arvet fra tabell plan:  host uuid,\n-- Arvet fra tabell plan:  apn uuid,\n-- Arvet fra tabell plan:  ptr uuid,\n-- Arvet fra tabell plan:  bufint bigint,\n-- Arvet fra tabell plan:  bufmem bigint,\n-- Arvet fra tabell plan:  bufdsk bigint,\n-- Arvet fra tabell plan:  exectime numeric(32,3),\n-- Arvet fra tabell plan:  duration numeric(32,3),\n  CONSTRAINT plan_20190221_pkey PRIMARY KEY (pack, recno),\n  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),\n  CONSTRAINT plan_20190221_dt_check CHECK (dt = '2019-02-21'::date)\n)\nINHERITS (public.plan)<\/code><\/pre>\n<p>\nDen totale st\u00f8rrelsen p\u00e5 seksjonen bestemmes av antall \u00abfakta\u00bb og avhenger kun av eksterne prosesser, s\u00e5 vi deler st\u00f8rrelsen p\u00e5 heap (<code>pg_relation_size<\/code>) for the number of entries in it \u2014 that is, we will get <b>the average size of the actual stored record<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Minus 6% of the volume<\/b>, excellent!<\/p>\n<p>But not everything is so rosy \u2014 after all, <b>we cannot change the order of fields in indexes<\/b>, and therefore \"in general\" (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 yet here, too, <b>we saved 1.5%<\/b>, without changing a single line of code. Indeed!<\/p>\n<p><img decoding=\"async\" alt=\"Sparer penger p\u00e5 store volum i PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I should note that the arrangement of fields given above is not necessarily the most optimal. Because some blocks of fields are not desirable to \"tear apart\" for aesthetic reasons \u2014 for example, a pair <code>(pack, recno)<\/code>, which is the PK for this table.<\/p>\n<p>In general, determining the \"minimal\" arrangement of fields is quite a simple \"brute force\" task. Therefore, you can achieve even better results on your data than we did \u2014 give it a try!<br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/498292\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u00ab\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00bb \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0433\u043e \u0432 PostgreSQL, \u0438 \u0438\u0445 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 TOAST \u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u00ab\u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u00bb \u044d\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0437\u0430\u0442\u043e \u2014 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79040,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79039","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043a\u043e\u043f\u0435\u0435\u0447\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-23T17:43:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T17:43:26+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47We save a penny on large volumes in PostgreSQL | ProHoster","description":"Continuing the topic of recording large data streams, raised in the previous article about partitioning, we will examine methods that can be used.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043a\u043e\u043f\u0435\u0435\u0447\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0432 PostgreSQL | ProHoster","og:description":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.","og:url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-23T17:43:26+00:00","article:modified_time":"2020-04-23T17:43:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79039","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:46:33","updated":"2022-09-28 06:02:32","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/79039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}