{"id":79028,"date":"2020-04-23T19:43:19","date_gmt":"2020-04-23T17:43:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb"},"modified":"2020-04-23T19:43:19","modified_gmt":"2020-04-23T17:43:19","slug":"pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Recentemente ho parlato di come utilizzare ricette standardizzate <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">per aumentare le prestazioni delle query SQL \u00abin lettura\u00bb<\/a><\/noindex> da un database PostgreSQL. Oggi parleremo di come <b>rendere pi\u00f9 efficiente la scrittura<\/b> nel database senza utilizzare alcun \u00abgiro di vite\u00bb nella configurazione \u2014 semplicemente organizzando correttamente i flussi di dati.<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/cbebbe0ed0e9a6590a4e8dd144f82f40.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>#1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>\nQuesto articolo discute come e perch\u00e9 sia utile organizzare <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">la partizione applicativa \u00abin teoria\u00bb<\/a><\/noindex> gi\u00e0 \u00e8 stato scritto, qui parleremo della pratica di applicazione di alcuni approcci nel nostro <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">servizio di monitoraggio di centinaia di server PostgreSQL.<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u00abFatti di tempi passati&#8230;\u00bb<\/h4>\n<p>\nInizialmente, come ogni MVP, il nostro progetto \u00e8 partito sotto un carico piuttosto ridotto \u2014 il monitoraggio veniva effettuato solo per una dozzina di server critici, tutte le tabelle erano relativamente compatte... Ma col passare del tempo, il numero dei nodi monitorati aumentava sempre di pi\u00f9, e tentando di fare di nuovo qualcosa con una delle <b>tabelle di dimensioni 1.5TB<\/b>, ci siamo resi conto che continuare cos\u00ec era possibile, ma davvero scomodo.<\/p>\n<p>I tempi erano quasi leggendari, varie versioni di PostgreSQL 9.x erano sulla cresta dell\u2019onda, quindi tutta la partizione doveva essere effettuata \u00abmanualmente\u00bb \u2014 tramite <b>ereditariet\u00e0 delle tabelle e trigger<\/b> routing dinamico <code>ESEGUI<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLa soluzione risultante si \u00e8 rivelata sufficientemente universale da poter essere traslata su tutte le tabelle:<\/p>\n<ul>\n<li>\u00c8 stata dichiarata una tabella \u00abgenitore\u00bb vuota, in cui sono stati descritti tutti i <b>indici e trigger necessari<\/b>.<\/li>\n<li>La registrazione dal punto di vista del client veniva eseguita nella tabella \u00abradice\u00bb, e internamente tramite <b>il trigger di routing<\/b> <code>PRIMA INSERT<\/code> la registrazione veniva \u00abfisicamente\u00bb inserita nella sezione necessaria. Se non esisteva ancora - catturavamo l'eccezione e &#8230;<\/li>\n<li>\u2026 tramite <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> veniva creata una <b>sezione con vincolo sulla data richiesta<\/b>, in modo che, durante il recupero dei dati, la lettura avvenisse solo in essa.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10: primo tentativo<\/h4>\n<p>\nTuttavia, la partizione tramite ereditariet\u00e0 storicamente non era molto adatta per lavorare con flussi di scrittura attivi o un gran numero di sezioni figlie. Ad esempio, si pu\u00f2 ricordare che l'algoritmo di selezione della sezione corretta aveva <b>complessit\u00e0 quadratica<\/b>, il che nei casi di oltre 100 sezioni porta a prestazioni, come potete immaginare\u2026<\/p>\n<p>In PG10 questa situazione \u00e8 stata notevolmente ottimizzata, implementando il supporto per <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">partizionamento nativo<\/a><\/noindex>. Quindi abbiamo provato subito a applicarlo subito dopo la migrazione dello storage, ma\u2026<\/p>\n<p>Come si \u00e8 scoperto dopo aver esaminato il manuale, la tabella nativamente partizionata in questa versione:<\/p>\n<ul>\n<li>non supporta la descrizione degli indici<\/li>\n<li>non supporta i trigger<\/li>\n<li>non pu\u00f2 essere un \u2018discendente\u2019 di nessuno<\/li>\n<li>non supporta <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>non riesce a generare sezioni automaticamente<\/li>\n<\/ul>\n<p>\nDopo aver preso colpi, abbiamo capito che senza modifiche all'applicazione non avremmo potuto procedere, e abbiamo messo in pausa ulteriori ricerche per sei mesi.<\/p>\n<h4>PG10: una seconda possibilit\u00e0<\/h4>\n<p>\nQuindi abbiamo iniziato a risolvere i problemi emersi uno alla volta:<\/p>\n<ol>\n<li>Poich\u00e9 i trigger e <code>ON CONFLICT<\/code> si sono rivelati comunque necessari in alcuni casi, per gestirli abbiamo creato una <b>tabella proxy.<\/b>.<\/li>\n<li><b>Ci siamo liberati del \u2018routing\u2019<\/b> nei trigger, ossia di <code>ESEGUI<\/code>.<\/li>\n<li>Abbiamo separato <b>una tabella template con tutti gli indici<\/b>, per far s\u00ec che non apparissero neppure nella tabella proxy.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nInfine, dopo tutto ci\u00f2, abbiamo nativamente partizionato la tabella principale. La creazione di una nuova sezione \u00e8 rimasta a carico dell'applicazione.<\/p>\n<h4>Stiamo \u2018scolpendo\u2019 i dizionari<\/h4>\n<p>\nCome in qualsiasi sistema analitico, anche noi avevamo <b>\u2018fatti\u2019 e \u2018dimensioni\u2019<\/b> (dizionari). Nel nostro caso, a questo riguardo fungevano, ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">il corpo del \u00abmodello\u00bb<\/a><\/noindex> di richieste lente di tipo simile o il testo della stessa richiesta.<\/p>\n<p>I \u00abfatti\u00bb erano gi\u00e0 stati sezionati per giorni da tempo, quindi abbiamo potuto eliminare tranquillamente le sezioni obsolete, e non ci davano fastidio (i log, dopotutto!). Ma con i dizionari siamo incappati in un problema\u2026<\/p>\n<p>Non si pu\u00f2 dire che fossero moltissimi, ma circa <b>con 100TB di \u00abfatti\u00bb, abbiamo avuto un dizionario di 2.5TB<\/b>. Da una tale tabella non si pu\u00f2 facilmente far nulla, non si pu\u00f2 comprimere in un tempo adeguato, e scrivere in essa stava diventando sempre pi\u00f9 lento.<\/p>\n<p>Sembra un dizionario\u2026 in cui ogni voce dovrebbe essere rappresentata esattamente una volta\u2026 ed \u00e8 corretto, ma!.. Nessuno ci impedisce di avere <b>un dizionario separato per ogni giorno<\/b>! S\u00ec, questo porta a una certa ridondanza, ma permette:<\/p>\n<ul>\n<li><b>di scrivere\/leggere pi\u00f9 velocemente<\/b> grazie a sezioni di dimensioni pi\u00f9 ridotte<\/li>\n<li><b>di consumare meno memoria<\/b> grazie a indici pi\u00f9 compatti<\/li>\n<li><b>di memorizzare meno dati<\/b> grazie alla possibilit\u00e0 di eliminare rapidamente i dati obsoleti<\/li>\n<\/ul>\n<p>\nDi conseguenza, a seguito di tutto questo insieme di misure <b>il carico sulla CPU \u00e8 diminuito di circa il 30%, quello del disco - di circa il 50%<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAlla fine, abbiamo continuato a scrivere nel database esattamente la stessa cosa, ma con un carico minore.<\/p>\n<h2>#2. \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u0411\u0414<\/h2>\n<p>\nQuindi, ci siamo fermati a quello che abbiamo <b>per ogni giorno c'\u00e8 la propria sezione<\/b> con i dati. In effetti, <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 ecco la chiave di partizionamento e la condizione per l'inserimento del record in una specifica sezione.<\/p>\n<p>Poich\u00e9 tutti i report nel nostro servizio sono costruiti in base a una data specifica, anche gli indici risalenti ai \u00abtempi non partizionati\u00bb erano tutti del tipo <i>(Server, <b>Data<\/b>, Modello di piano)<\/i>, <i>(Server, <b>Data<\/b>, Nodo del piano)<\/i>, <i>(<b>Data<\/b>, Classe di errore, Server)<\/i>,\u2026<\/p>\n<p>Ma ora in ogni sezione vivono <u>i propri istanziamenti<\/u> di ogni indice di questo tipo... E all'interno di ogni sezione <u>la data \u00e8 una costante<\/u>\u2026 Risulta che ora inseriamo in ciascun indice <b>banalmente una costante<\/b> come uno dei campi, il che aumenta sia il suo volume che il tempo di ricerca, ma non porta alcun risultato. Ci siamo lasciati dei trabocchetti, ops...<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLa direzione dell'ottimizzazione \u00e8 ovvia: semplicemente <b>rimuoviamo il campo con la data da tutti gli indici<\/b> nelle tabelle partizionate. Con i nostri volumi, il guadagno \u00e8 di circa <b>1TB\/settimana<\/b>!<\/p>\n<p>E ora notiamo che questo terabyte doveva ancora essere registrato in qualche modo. Cio\u00e8, dovevamo ancora <b>il disco ora deve caricare meno<\/b>! In questa immagine \u00e8 ben visibile l'effetto ottenuto dalla pulizia a cui abbiamo dedicato una settimana:<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/f45e3b26337074a07751ea28961009bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>#3. \u00ab\u0420\u0430\u0437\u043c\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u00bb \u043f\u0438\u043a\u043e\u0432\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443<\/h2>\n<p>\nUno dei grandi problemi dei sistemi sovraccarichi \u00e8 la <b>sovrasincronizzazione<\/b> di operazioni non necessarie. A volte 'perch\u00e9 non ce ne siamo accorti', altre volte 'era pi\u00f9 semplice', ma prima o poi si deve eliminarla.<\/p>\n<p>Avviciniamo l'immagine precedente e vediamo che il disco <b>\u2018sta scaricando\u2019 un carico con un'ampiezza doppia<\/b> tra le misurazioni adiacenti, cosa che chiaramente non dovrebbe esserci 'statisticamente' con un tale numero di operazioni:<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOttenerlo \u00e8 abbastanza semplice. Avevamo sotto monitoraggio quasi <b>1000 server<\/b>, ciascuno elaborato da un flusso logico distinto, e ogni flusso invia l'informazione accumulata nel database a intervalli regolari, pi\u00f9 o meno cos\u00ec:<\/p>\n<pre><code class=\"javascript\">setInterval(sendToDB, interval)<\/code><\/pre>\n<p>\nIl problema risiede esattamente nel fatto che <b>tutti i flussi partono pi\u00f9 o meno contemporaneamente<\/b>, quindi i momenti di invio coincidono quasi sempre \u2018fino al punto\u2019. Ups n.2\u2026<\/p>\n<p>Fortunatamente, questo si risolve abbastanza facilmente, <b>aggiungendo una 'variazione' casuale<\/b> nel tempo:<\/p>\n<pre><code class=\"javascript\">setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))<\/code><\/pre>\n<p><\/p>\n<h2>#4. \u041a\u044d\u0448\u0438\u0440\u0443\u0435\u043c, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043c\u043e\u0436\u043d\u043e<\/h2>\n<p>\nIl terzo problema tradizionale del highload \u2014 <b>mancanza di cache<\/b> dove dovrebbe <i>potrebbe<\/i> essere.<\/p>\n<p>Ad esempio, abbiamo reso possibile l'analisi in base ai nodi del piano (tutti questi <code>Seq Scan on users<\/code>), ma pensare subito che siano tutti uguali \u2014 \u00e8 un'idea sbagliata.<\/p>\n<p>No, naturalmente, nel database non si scrive nulla due volte, questo esclude il trigger con <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Ma i dati arrivano comunque al database, e bisogna effettuare letture aggiuntive <b>per verificare i conflitti.<\/b> Oops n\u00b03\u2026<\/p>\n<p>La differenza nel numero di record inviati al database prima\/dopo l'attivazione della cache \u00e8 evidente:<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE questo \u00e8 il conseguente calo del carico sullo storage:<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Totale<\/h2>\n<p>\n\u00abTerabyte-al-giorno\u00bb sembra spaventoso. Se fai tutto correttamente, si tratta semplicemente di <b>2^40 byte \/ 86400 secondi = ~12.5MB\/s<\/b>, che sono stati gestiti anche dai dischi IDE desktop. \ud83d\ude42<\/p>\n<p>E se parliamo seriamente, anche con un \u00absbilanciamento\u00bb di carico dieci volte superiore durante il giorno, puoi tranquillamente rimanere entro le capacit\u00e0 dei moderni SSD.<\/p>\n<p><img decoding=\"async\" alt=\"Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1TB\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437 PostgreSQL-\u0431\u0430\u0437\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u00ab\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u043a\u00bb \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. #1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0442\u0435\u043e\u0440\u0438\u0438\u00bb [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79029,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79028","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437 PostgreSQL-\u0431\u0430\u0437\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u00ab\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u043a\u00bb \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. #1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0442\u0435\u043e\u0440\u0438\u0438\u00bb\" \/>\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\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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\u041f\u0438\u0448\u0435\u043c \u0432 PostgreSQL \u043d\u0430 \u0441\u0443\u0431\u0441\u0432\u0435\u0442\u043e\u0432\u043e\u0439: 1 host, 1 day, 1TB | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437 PostgreSQL-\u0431\u0430\u0437\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u00ab\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u043a\u00bb \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. #1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0442\u0435\u043e\u0440\u0438\u0438\u00bb\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\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:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T17:43:19+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\udd47Scriviamo in PostgreSQL a velocit\u00e0 subluminale: 1 host, 1 giorno, 1 TB | ProHoster","description":"Recentemente ho parlato di come aumentare le prestazioni delle query SQL di lettura da un database PostgreSQL utilizzando ricette standard. Oggi discuter\u00f2 di come rendere pi\u00f9 efficiente la scrittura nel database senza utilizzare alcun tipo di \"manopola\" nella configurazione, semplicemente organizzando correttamente i flussi di dati. #1. Partizionamento Articolo su come e perch\u00e9 organizzare il partizionamento applicativo \"in teoria\".","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","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\u041f\u0438\u0448\u0435\u043c \u0432 PostgreSQL \u043d\u0430 \u0441\u0443\u0431\u0441\u0432\u0435\u0442\u043e\u0432\u043e\u0439: 1 host, 1 day, 1TB | ProHoster","og:description":"\u041d\u0435\u0434\u0430\u0432\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c SQL-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u00ab\u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435\u00bb \u0438\u0437 PostgreSQL-\u0431\u0430\u0437\u044b. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0436\u0435 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u0411\u0414 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u00ab\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u043a\u00bb \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0432 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. #1. \u0421\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438 \u0437\u0430\u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0435 \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u00ab\u0432 \u0442\u0435\u043e\u0440\u0438\u0438\u00bb","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","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:19+00:00","article:modified_time":"2020-04-23T17:43:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79028","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:34","updated":"2022-10-01 20:30:41"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/79028","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=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}