{"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\/fr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","title":{"rendered":"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>R\u00e9cemment, j'ai expliqu\u00e9 comment utiliser des recettes standards <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/492694\/\">pour am\u00e9liorer les performances des requ\u00eates SQL \u00ab en lecture \u00bb<\/a><\/noindex> \u00e0 partir d'une base de donn\u00e9es PostgreSQL. Aujourd'hui, nous allons aborder comment <b>rendre l'\u00e9criture<\/b> dans la base de donn\u00e9es plus efficace sans avoir recours \u00e0 des r\u00e9glages complexes dans la configuration \u2014 simplement en organisant correctement les flux de donn\u00e9es.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" 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>\nCet article traite de la mani\u00e8re et de la raison pour laquelle il est important d'organiser <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/483170\/\">le partitionnement applicatif \u00ab en th\u00e9orie \u00bb<\/a><\/noindex> a d\u00e9j\u00e0 \u00e9t\u00e9 abord\u00e9, ici nous parlerons des pratiques d'application de certaines approches dans le cadre de notre <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">service de surveillance de centaines de serveurs PostgreSQL.<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>\u00abDes affaires d'un temps r\u00e9volu\u2026\u00bb<\/h4>\n<p>\nInitialement, comme tout MVP, notre projet a d\u00e9marr\u00e9 sous une charge relativement l\u00e9g\u00e8re \u2014 la surveillance n'\u00e9tait effectu\u00e9e que pour une dizaine de serveurs critiques, toutes les tables \u00e9taient relativement compactes... Mais le temps a pass\u00e9, le nombre d'h\u00f4tes surveill\u00e9s a continu\u00e9 d'augmenter, et en essayant encore une fois de g\u00e9rer l'une des <b>tables de 1.5 To<\/b>, nous avons compris que continuer ainsi \u00e9tait possible, mais tr\u00e8s inconfortable.<\/p>\n<p>Les temps \u00e9taient presque l\u00e9gendaires, diff\u00e9rentes versions de PostgreSQL 9.x \u00e9taient en cours, donc tout le partitionnement devait \u00eatre effectu\u00e9 \u00ab manuellement \u00bb \u2014 via <b>l'h\u00e9ritage des tables et des d\u00e9clencheurs<\/b> de routage dynamique. <code>EXECUTE<\/code>.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/a480e75ccec73080aa2d0be1435d2a2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLa solution obtenue s'est r\u00e9v\u00e9l\u00e9e suffisamment universelle pour pouvoir \u00eatre transpos\u00e9e \u00e0 toutes les tables :<\/p>\n<ul>\n<li>Une table \u00ab parent \u00bb vide a \u00e9t\u00e9 d\u00e9clar\u00e9e, sur laquelle tous <b>les index et d\u00e9clencheurs n\u00e9cessaires \u00e9taient d\u00e9crits.<\/b>.<\/li>\n<li>L'\u00e9criture du point de vue du client se faisait dans la table \u00ab racine \u00bb, et \u00e0 l'int\u00e9rieur \u00e0 l'aide de <b>un d\u00e9clencheur de routage<\/b> <code>AVANT INSERT<\/code> l'enregistrement \u00e9tait \u00abphysiquement\u00bb ins\u00e9r\u00e9 dans la section requise. Si elle n'existait pas encore, nous attrapions l'exception et\u2026<\/li>\n<li>\u2026 \u00e0 l'aide de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/492464\/\"><code>CREATE TABLE ... (LIKE ... INCLUDING ...)<\/code><\/a><\/noindex> une section \u00e9tait cr\u00e9\u00e9e selon le mod\u00e8le de la table parent <b>avec une contrainte sur la date souhait\u00e9e,<\/b>de sorte qu'\u00e0 la lecture des donn\u00e9es, cela ne se fasse que dans celle-ci.<\/li>\n<\/ul>\n<p><\/p>\n<h4>PG10 : premi\u00e8re tentative<\/h4>\n<p>\nMais le partitionnement par h\u00e9ritage \u00e9tait historiquement mal adapt\u00e9 au traitement d'un flux actif d'\u00e9critures ou \u00e0 un grand nombre de sections enfants. Par exemple, on peut se souvenir que l'algorithme de s\u00e9lection de la section appropri\u00e9e avait <b>une complexit\u00e9 quadratique<\/b>, ce qui, avec 100+ sections, fonctionnait, vous comprenez comment...<\/p>\n<p>Dans PG10, cette situation a \u00e9t\u00e9 consid\u00e9rablement optimis\u00e9e en introduisant la prise en charge du <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/ddl-partitioning\">partitionnement natif.<\/a><\/noindex>. Nous avons donc imm\u00e9diatement essay\u00e9 de l'appliquer juste apr\u00e8s la migration du stockage, mais\u2026<\/p>\n<p>Comme il s'est av\u00e9r\u00e9 apr\u00e8s avoir fouill\u00e9 le manuel, une table nativement partitionn\u00e9e dans cette version :<\/p>\n<ul>\n<li>ne prend pas en charge la description des index<\/li>\n<li>ne prend pas en charge les triggers<\/li>\n<li>ne peut pas \u00eatre elle-m\u00eame un \u00ab descendant \u00bb<\/li>\n<li>ne prend pas en charge <code>INSERT ... ON CONFLICT<\/code><\/li>\n<li>ne sait pas g\u00e9n\u00e9rer une section automatiquement<\/li>\n<\/ul>\n<p>\nApr\u00e8s avoir re\u00e7u un coup de pied au visage, nous avons compris qu'il \u00e9tait impossible de contourner la modification de l'application et avons retard\u00e9 nos recherches pendant six mois.<\/p>\n<h4>PG10 : deuxi\u00e8me chance<\/h4>\n<p>\nAinsi, nous avons commenc\u00e9 \u00e0 r\u00e9soudre les probl\u00e8mes rencontr\u00e9s un \u00e0 un :<\/p>\n<ol>\n<li>Puisque les triggers et <code>ON CONFLICT<\/code> nous \u00e9taient parfois n\u00e9cessaires, nous avons cr\u00e9\u00e9 une <b>table proxy<\/b>.<\/li>\n<li><b>Nous avons \u00e9limin\u00e9 le \u00ab routage \u00bb<\/b> dans les triggers \u2014 c'est-\u00e0-dire de <code>EXECUTE<\/code>.<\/li>\n<li>Nous avons extrait s\u00e9par\u00e9ment <b>la table mod\u00e8le avec tous les index<\/b>, afin qu'ils ne figurent m\u00eame pas dans la table proxy.<\/li>\n<\/ol>\n<p>\n<img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/db3118798357575568489f6b575373b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEnfin, apr\u00e8s tout cela, nous avons nativement partitionn\u00e9 la table principale. La cr\u00e9ation d'une nouvelle section reste pour l'application.<\/p>\n<h4>Nous \u00ab sculptons \u00bb les dictionnaires<\/h4>\n<p>\nComme dans tout syst\u00e8me analytique, nous avions aussi <b>des \u00ab faits \u00bb et des \u00ab d\u00e9coupes \u00bb<\/b> (dictionnaires). Dans notre cas, cela \u00e9tait repr\u00e9sent\u00e9 par exemple par <noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/5XKbFb-l5Do?t=2487\">le corps du \u00ab template \u00bb<\/a><\/noindex> des requ\u00eates lentes de type similaire ou le texte m\u00eame de la requ\u00eate.<\/p>\n<p>Les \u00ab faits \u00bb \u00e9taient d\u00e9j\u00e0 partitionn\u00e9s par jour depuis longtemps, donc nous avons pu supprimer les sections obsol\u00e8tes sans probl\u00e8me (apr\u00e8s tout, ce sont juste des logs !). En revanche, pour les dictionnaires, cela a pos\u00e9 probl\u00e8me\u2026<\/p>\n<p>Ce n'est pas qu'il y en avait \u00e9norm\u00e9ment, mais environ <b>pour 100 To de \u00ab faits \u00bb, il y avait un dictionnaire de 2,5 To<\/b>. Il est difficile de supprimer quoi que ce soit d'une telle table dans un d\u00e9lai raisonnable, et l'\u00e9criture dans celle-ci devenait de plus en plus lente.<\/p>\n<p>On dirait un dictionnaire\u2026 o\u00f9 chaque entr\u00e9e devrait \u00eatre repr\u00e9sent\u00e9e exactement une fois\u2026 et c'est vrai, mais !.. Personne ne nous emp\u00eache d'avoir <b>un dictionnaire s\u00e9par\u00e9 pour chaque jour<\/b>! Oui, cela apporte une certaine redondance, mais cela permet :<\/p>\n<ul>\n<li><b>d'\u00e9crire\/ lire plus rapidement<\/b> gr\u00e2ce \u00e0 une taille de section plus petite<\/li>\n<li><b>de consommer moins de m\u00e9moire<\/b> gr\u00e2ce \u00e0 des index plus compacts<\/li>\n<li><b>de stocker moins de donn\u00e9es<\/b> gr\u00e2ce \u00e0 la possibilit\u00e9 de supprimer rapidement les \u00e9l\u00e9ments obsol\u00e8tes<\/li>\n<\/ul>\n<p>\n\u00c0 la suite de l'ensemble de ces mesures <b>la charge CPU a diminu\u00e9 d'environ 30 %, et celle du disque d'environ 50 %<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/fd3a219a304dc46173a7eb435502fe02.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNous avons continu\u00e9 \u00e0 \u00e9crire dans la base exactement la m\u00eame chose, juste avec une charge moindre.<\/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>\nNous avons donc convenu que nous avons <b>une section d\u00e9di\u00e9e pour chaque jour<\/b> avec des donn\u00e9es. En effet, <code>CHECK (dt = '2018-10-12'::date)<\/code> \u2014 c'est la cl\u00e9 de partitionnement et la condition d'inclusion d'un enregistrement dans une section particuli\u00e8re.<\/p>\n<p>Comme tous les rapports de notre service sont \u00e9tablis sur la base d'une date sp\u00e9cifique, les index, m\u00eame ceux des \u00ab temps non partitionn\u00e9s \u00bb, \u00e9taient tous de type <i>(Serveur, <b>Date<\/b>, Mod\u00e8le de plan)<\/i>, <i>(Serveur, <b>Date<\/b>, N\u0153ud de plan)<\/i>, <i>(<b>Date<\/b>, Classe d'erreur, Serveur)<\/i>,\u2026<\/p>\n<p>Mais maintenant, chaque section a <u>ses propres instances<\/u> de chaque tel index... Et dans chaque section, <u>la date est une constante<\/u>... Cela signifie que nous inscrivons maintenant une constante <b>comme l'un des champs dans chaque index, ce qui augmente \u00e0 la fois son volume et le temps de recherche, sans apporter aucun r\u00e9sultat. Nous avons laiss\u00e9 des pi\u00e8ges pour nous-m\u00eames, oups...<\/b> L'orientation de l'optimisation est \u00e9vidente \u2014 il suffit de<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/c7644644b960c568c4adaeec57cfef2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nretirer le champ de la date de tous les index <b>des tables partitionn\u00e9es. Avec nos volumes, le gain est d'environ<\/b> 1 To\/semaine <b>Et maintenant, remarquons que ce t\u00e9raoctet devait \u00e9galement \u00eatre \u00e9crit d'une mani\u00e8re ou d'une autre. Cela signifie que nous devons \u00e9galement<\/b>!<\/p>\n<p>charger moins le disque <b>! Sur cette image, on peut bien voir l'effet obtenu apr\u00e8s le nettoyage que nous avons consacr\u00e9 une semaine \u00e0 r\u00e9aliser :<\/b>L'un des grands probl\u00e8mes des syst\u00e8mes charg\u00e9s est<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" 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>\nla synchronisation excessive <b>de certaines op\u00e9rations qui ne le n\u00e9cessitent pas. Parfois \u00ab parce qu'on ne l'a pas remarqu\u00e9 \u00bb, parfois \u00ab c'\u00e9tait plus simple \u00bb, mais t\u00f4t ou tard, il faut s'en d\u00e9barrasser.<\/b> En rapprochant l'image pr\u00e9c\u00e9dente, nous voyons que le disque<\/p>\n<p>\u00ab pompe \u00bb la charge avec une amplitude double <b>entre les relev\u00e9s voisins, ce qui ne devrait clairement pas \u00eatre \u00ab statistiquement \u00bb le cas avec un tel nombre d'op\u00e9rations :<\/b> Il est assez simple d'y parvenir. Notre surveillance \u00e9tait d\u00e9j\u00e0 configur\u00e9e pour<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/ac3f19213cba0f111864c6dbf9a73912.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\npr\u00e8s de 1000 serveurs <b>, chacun trait\u00e9 par un flux logique distinct, et chaque flux envoie les informations accumul\u00e9es vers la base \u00e0 une fr\u00e9quence d\u00e9finie, \u00e0 peu pr\u00e8s comme ceci :<\/b>setInterval(sendToDB, interval)<\/p>\n<pre><code class=\"javascript\">Le probl\u00e8me r\u00e9side pr\u00e9cis\u00e9ment dans le fait que<\/code><\/pre>\n<p>\ntous les flux d\u00e9marrent \u00e0 peu pr\u00e8s en m\u00eame temps <b>, donc les moments d'envoi co\u00efncident presque toujours \u00ab jusqu'\u00e0 la pointe \u00bb. Oups n\u00b02...<\/b>Heureusement, cela se corrige assez facilement,<\/p>\n<p>en ajoutant un \u00ab d\u00e9calage al\u00e9atoire \u00bb <b>dans le temps :<\/b> setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))<\/p>\n<pre><code class=\"javascript\">Le troisi\u00e8me probl\u00e8me traditionnel du highload est<\/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>\nl'absence de cache <b>l\u00e0 o\u00f9 il<\/b> devrait \u00eatre. <i>pourrais<\/i> \u00eatre.<\/p>\n<p>Par exemple, nous avons rendu possible l'analyse par n\u0153ud de plan (tous ces <code>Scan Seq sur les utilisateurs<\/code>), mais penser tout de suite qu'ils sont, dans l'ensemble, identiques \u2014 c'est oublier.<\/p>\n<p>Non, bien s\u00fbr, rien n'est r\u00e9\u00e9crit dans la base, cela coupe le d\u00e9clencheur avec <code>INSERT ... ON CONFLICT DO NOTHING<\/code>. Mais ces donn\u00e9es atteignent quand m\u00eame la base, et cela implique aussi une lecture suppl\u00e9mentaire pour v\u00e9rifier le conflit. <b>Cela doit \u00eatre fait. Oups n\u00b03\u2026<\/b> La diff\u00e9rence dans le nombre d'enregistrements envoy\u00e9s \u00e0 la base avant\/apr\u00e8s l'activation du caching est \u00e9vidente :<\/p>\n<p>Et cela \u2014 une diminution concomitante de la charge sur le stockage :<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/37fa7e64a674f03a79f2765a79ec8138.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00abT\u00e9raoctets par jour\u00bb sonne seulement effrayant. Si vous faites tout correctement, c'est juste<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/b2c563b4b41755211e77768d80f8702f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h2>Au total<\/h2>\n<p>\n2^40 octets \/ 86400 secondes = ~12.5 Mo\/s <b>, ce que m\u00eame les disques durs IDE de bureau pouvaient g\u00e9rer. \ud83d\ude42<\/b>Et pour \u00eatre s\u00e9rieux, m\u00eame avec un \u00abbiais\u00bb de charge multipli\u00e9 par dix pendant une journ\u00e9e, vous pouvez tranquillement respecter les capacit\u00e9s des SSD modernes.<\/p>\n<p>R\u00e9cemment, j'ai expliqu\u00e9 comment augmenter les performances des requ\u00eates SQL \u00abde lecture\u00bb gr\u00e2ce \u00e0 des recettes standard.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9crivons dans PostgreSQL sur subluminal : 1 h\u00f4te, 1 jour, 1 To\" src=\"\/wp-content\/uploads\/2020\/04\/6f3f8d4636ba50f3d5401bf4e456757f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Source : <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 5.0.2 - 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.\" \/>\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\/fr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/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\udd47\u00c9crivons dans PostgreSQL en vitesse supraluminique : 1 h\u00f4te, 1 jour, 1 To | ProHoster","description":"\ud83e\udd47Nous \u00e9crivons dans PostgreSQL \u00e0 la vitesse de la lumi\u00e8re : 1 h\u00f4te, 1 jour, 1 To | ProHoster","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/pishem-v-postgresql-na-subsvetovoj-1-host-1-day-1tb","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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.","og:url":"https:\/\/prohoster.info\/fr\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/79028","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=79028"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/79028\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/79029"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=79028"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=79028"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=79028"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}