{"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\/it\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Continuando il tema della registrazione di grandi flussi di dati sollevato <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">nell'articolo precedente sulla partizione<\/a><\/noindex>, in questo esamineremo i modi in cui \u00e8 possibile <b>ridurre le dimensioni \"fisiche\" dei dati memorizzati<\/b> in PostgreSQL e il loro impatto sulle prestazioni del server.<\/p>\n<p>Si parler\u00e0 di <b>impostazioni TOAST e allineamento dei dati<\/b>. \"In media\", questi metodi permetteranno un risparmio non troppo significativo di risorse, ma \u2014 senza modificare il codice dell'applicazione.<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTuttavia, la nostra esperienza si \u00e8 rivelata piuttosto produttiva in questo senso, poich\u00e9 lo storage di quasi ogni monitoraggio \u00e8 per sua natura <b>per lo pi\u00f9 append-only<\/b> dal punto di vista dei dati scritti. E se siete interessati a sapere come si pu\u00f2 insegnare al database a scrivere su disco invece di <b>200MB\/s<\/b> in met\u00e0 \u2014 vi invito a continuare a leggere.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Piccole segrete sui grandi dati<\/h2>\n<p>\nPer il profilo di lavoro <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">del nostro servizio,<\/a><\/noindex>riceve regolarmente dai log <b>pacchetti di testo<\/b>.<\/p>\n<p>E poich\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">il complesso SBIS,<\/a><\/noindex>le cui basi dati monitoriamo, \u00e8 un prodotto multi-componente con strutture dati complesse, le richieste <b>per raggiungere prestazioni massime<\/b> risultano piuttosto <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">\"multivolumetriche\" con logiche algoritmiche complesse.<\/a><\/noindex>Quindi anche il volume di ciascun singolo esempio di richiesta o del piano di esecuzione risultante nel log che ci arriva risulta \"in media\" piuttosto grande.<\/p>\n<p>Diamo un'occhiata alla struttura di una delle tabelle in cui scriviamo i \"dati grezzi\" \u2014 ovvero il testo originale registrato nel log:<\/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 -- chiave di sezione\n    date\n, data -- la cosa pi\u00f9 importante\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nUna tabella tipica (gi\u00e0 partizionata, ovviamente, quindi questo \u00e8 un modello di sezione), dove la cosa pi\u00f9 importante \u00e8 il testo. A volte \u00e8 abbastanza voluminoso.<\/p>\n<p>Ricordiamo che la dimensione \"fisica\" di una registrazione in PG non pu\u00f2 occupare pi\u00f9 di una pagina di dati, ma la dimensione \"logica\" \u00e8 tutta un'altra cosa. Per scrivere un valore voluminoso in un campo (varchar\/text\/bytea) si utilizza <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">la tecnologia TOAST<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL utilizza una dimensione di pagina fissa (solitamente 8 KB) e non consente ai tuple di occupare pi\u00f9 pagine. Pertanto, non \u00e8 possibile memorizzare direttamente valori molto grandi nei campi. Per superare questa limitazione, i valori di campo grandi vengono compressi e\/o suddivisi in pi\u00f9 righe fisiche. Questo avviene in modo trasparente per l'utente e influisce solo lievemente su gran parte del codice del server. Questo metodo \u00e8 noto come TOAST ...<\/p><\/blockquote>\n<p>\nIn effetti, per ogni tabella con campi \"potenzialmente grandi\" viene automaticamente <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">creata una tabella ausiliaria con \"segmentazione\"<\/a><\/noindex> di ogni record \"grande\" in segmenti da 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>\nCio\u00e8, se dobbiamo scrivere una riga con un valore \"grande\" <code>data<\/code>, la registrazione reale avverr\u00e0 <b>non solo nella tabella principale e nel suo PK, ma anche in TOAST e nel suo PK<\/b>.<\/p>\n<h4>Riduciamo l'influenza di TOAST<\/h4>\n<p>\nMa la maggior parte dei record non \u00e8 comunque cos\u00ec grande, <b>devono rimanere entro 8KB<\/b> \u2014 come possiamo risparmiare su questo?..<\/p>\n<p>Qui ci viene in aiuto l'attributo <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> per la colonna della tabella:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> consente sia la compressione che la memorizzazione separata. Questo <b>\u00e8 l'opzione standard<\/b> per la maggior parte dei tipi di dati compatibili con TOAST. Inizialmente si tenta la compressione, poi si procede al salvataggio al di fuori della tabella se la riga \u00e8 ancora troppo grande.<\/li>\n<li><b>MAIN<\/b> consente la compressione, ma non la memorizzazione separata. (In effetti, la memorizzazione separata verr\u00e0 comunque eseguita per tali colonne, ma solo <b>come ultima risorsa<\/b>, quando non ci sono altri modi per ridurre la riga in modo che possa adattarsi alla pagina.)<\/li>\n<\/ul>\n<\/blockquote>\n<p>In effetti, questo \u00e8 esattamente ci\u00f2 di cui abbiamo bisogno per il testo \u2014 <b>massimamente comprimere, e se proprio non riesce a stare \u2014 spostarlo in TOAST<\/b>. Questo pu\u00f2 essere fatto direttamente \"al volo\", con un solo comando:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/code><\/pre>\n<p><\/p>\n<h4>Come valutare l'effetto<\/h4>\n<p>\nPoich\u00e9 ogni giorno il flusso di dati cambia, non possiamo confrontare cifre assolute, ma in termini relativi, quanto <b>minore \u00e8 la quota<\/b> che abbiamo registrato in TOAST \u2014 tanto meglio. Ma qui c'\u00e8 un rischio: maggiore \u00e8 il nostro volume \"fisico\" di ogni registrazione, tanto pi\u00f9 \"ampio\" diventa l'indice, perch\u00e9 dobbiamo coprire un maggior numero di pagine di dati.<\/p>\n<p>Sezione <b>prima delle modifiche<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)\n<\/code><\/pre>\n<p>\nSezione <b>dopo le modifiche<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/code><\/pre>\n<p>\nIn effetti, abbiamo <b>iniziato a scrivere in TOAST la met\u00e0 delle volte in meno<\/b>, che ha alleggerito non solo il disco, ma anche la CPU:<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOsserver\u00f2 che abbiamo anche iniziato a \"leggere\" meno il disco, non solo a \"scrivere\" - poich\u00e9 durante l'inserimento di una riga in una tabella \u00e8 necessario \"leggere\" anche parte dell'albero di ciascun indice per determinare la sua futura posizione in essi.<\/p>\n<h2>A chi vive bene con PostgreSQL 11<\/h2>\n<p>\nDopo l'aggiornamento a PG11 abbiamo deciso di continuare a \"ottimizzare\" TOAST e abbiamo notato che, a partire da questa versione, \u00e8 stato reso disponibile per la configurazione il parametro <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>Il codice di gestione di TOAST si attiva solo quando il valore della riga da memorizzare nella tabella supera il limite di TOAST_TUPLE_THRESHOLD byte (di solito 2 KB). Il codice TOAST comprimer\u00e0 e\/o sposter\u00e0 i valori del campo al di fuori della tabella fino a quando il valore della riga non scender\u00e0 al di sotto di TOAST_TUPLE_TARGET byte (una dimensione variabile, anch'essa di solito 2 KB) o ridurre il volume diventer\u00e0 impossibile.<\/p><\/blockquote>\n<p>Abbiamo deciso che i nostri dati sono di solito \"totalmente brevi\" o \"veramente lunghi\", quindi abbiamo deciso di limitarci al valore minimo possibile:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nDiamo un'occhiata a come le nuove impostazioni hanno influito sul caricamento del disco dopo la riconfigurazione:<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNon male! La media <b>della coda verso il disco \u00e8 diminuita<\/b> circa di 1,5 volte, e la \"occupazione\" del disco - di circa il 20%! Ma forse questo ha influito anche sulla CPU?<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlmeno, di certo non \u00e8 peggiorato. Anche se, \u00e8 difficile giudicare se anche questi volumi non riescono a sollevare il carico medio della CPU oltre <b>5%<\/b>.<\/p>\n<h2>Dal cambio di posti degli addendi la somma... cambia!<\/h2>\n<p>\nCome \u00e8 noto, un centesimo risparmia un rublo e con i nostri volumi di archiviazione di circa <b>10TB\/mese<\/b> anche una piccola ottimizzazione pu\u00f2 portare a un buon profitto. Pertanto, abbiamo prestato attenzione alla struttura fisica dei nostri dati - come sono concretamente <b>\"stratificati\" i campi all'interno di ogni registrazione<\/b> di ciascuna delle tabelle.<\/p>\n<p>Perch\u00e9 a causa di <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">allineamento dei dati<\/a><\/noindex> questo influisce direttamente <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">sul volume risultante<\/a><\/noindex>:<\/p>\n<blockquote><p>Molte architetture prevedono l'allineamento dei dati sui confini delle parole del computer. Ad esempio, su un sistema a 32 bit x86, i numeri interi (tipo intero, che occupa 4 byte) saranno allineati al confine delle parole da 4 byte, cos\u00ec come i numeri in virgola mobile a doppia precisione (tipo doppia precisione, 8 byte). E su un sistema a 64 bit i valori doppi saranno allineati al confine delle parole da 8 byte. Questa \u00e8 un'altra ragione per l'incompatibilit\u00e0.<\/p>\n<p>A causa dell'allineamento, la dimensione della riga della tabella dipende dall'ordine in cui sono disposti i campi. Di solito, questo effetto non \u00e8 molto evidente, ma in alcuni casi pu\u00f2 portare a un notevole aumento della dimensione. Ad esempio, se si mescolano campi di tipo char(1) e integer, tra di essi di solito andranno persi 3 byte senza motivo.<\/p><\/blockquote>\n<p>\nIniziamo con modelli sintetici:<\/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>\nDa dove sono arrivati quei due byte extra nel primo caso? \u00c8 semplice \u2014 <b>un smallint di 2 byte si allinea su un confine di 4 byte<\/b> prima del campo successivo, e quando \u00e8 l'ultimo, non c'\u00e8 niente da allineare e non serve farlo.<\/p>\n<p>In teoria, va tutto bene e si possono spostare i campi come si vuole. Verifichiamo con dati reali usando un esempio di una delle tabelle, la cui sezione giornaliera occupa da 10 a 15 GB.<\/p>\n<p>Struttura originale:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- Eredita dalla tabella plan:  pack uuid NOT NULL,\n-- Eredita dalla tabella plan:  recno smallint NOT NULL,\n-- Eredita dalla tabella plan:  host uuid,\n-- Eredita dalla tabella plan:  ts timestamp with time zone,\n-- Eredita dalla tabella plan:  exectime numeric(32,3),\n-- Eredita dalla tabella plan:  duration numeric(32,3),\n-- Eredita dalla tabella plan:  bufint bigint,\n-- Eredita dalla tabella plan:  bufmem bigint,\n-- Eredita dalla tabella plan:  bufdsk bigint,\n-- Eredita dalla tabella plan:  apn uuid,\n-- Eredita dalla tabella plan:  ptr uuid,\n-- Eredita dalla tabella 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>\nSezione dopo aver modificato l'ordine delle colonne \u2014 esattamente <b>gli stessi campi, solo con un ordine diverso<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- Eredita dalla tabella plan:  dt date NOT NULL,\n-- Eredita dalla tabella plan:  ts timestamp with time zone,\n-- Eredita dalla tabella plan:  pack uuid NOT NULL,\n-- Eredita dalla tabella plan:  recno smallint NOT NULL,\n-- Eredita dalla tabella plan:  host uuid,\n-- Eredita dalla tabella plan:  apn uuid,\n-- Eredita dalla tabella plan:  ptr uuid,\n-- Eredita dalla tabella plan:  bufint bigint,\n-- Eredita dalla tabella plan:  bufmem bigint,\n-- Eredita dalla tabella plan:  bufdsk bigint,\n-- Eredita dalla tabella plan:  exectime numeric(32,3),\n-- Eredita dalla tabella 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>\nIl volume complessivo della sezione \u00e8 determinato dal numero di \u00abfatti\u00bb e dipende solo dai processi esterni, quindi dividiamo la dimensione dell'heap (<code>pg_relation_size<\/code>) al numero di registrazioni in esso \u2014 quindi otterremo <b>la dimensione media della registrazione reale memorizzata<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Meno il 6% del volume<\/b>, ottimo!<\/p>\n<p>Ma tutto, naturalmente, non \u00e8 cos\u00ec roseo \u2014 infatti <b>non possiamo cambiare l'ordine dei campi negli indici<\/b>, e quindi \u00abin generale\u00bb (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 comunque anche qui <b>abbiamo risparmiato l'1,5%<\/b>, senza modificare una riga di codice. Proprio cos\u00ec!<\/p>\n<p><img decoding=\"async\" alt=\"Risparmiamo qualche centesimo su grandi volumi con PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nota che la disposizione dei campi sopra riportata non \u00e8 detto che sia la pi\u00f9 ottimale. Perch\u00e9 alcuni blocchi di campi non vogliamo \u00abspezzarli\u00bb per motivi estetici \u2014 ad esempio, una coppia <code>(pack, recno)<\/code>, che \u00e8 la PK per questa tabella.<\/p>\n<p>In generale, la definizione di una disposizione \u00abminimale\u00bb dei campi \u00e8 un compito piuttosto semplice di \u00abpermutazione\u00bb. Pertanto, puoi ottenere risultati anche migliori sui tuoi dati rispetto a noi \u2014 prova!<br \/>\n<br \/>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Risparmiamo centesimi su grandi volumi in PostgreSQL | ProHoster","description":"Continuando il tema della registrazione di grandi flussi di dati, sollevato dal precedente articolo sulla partizione, qui considereremo i modi in cui \u00e8 possibile.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/79039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}