{"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\/fr\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En poursuivant le sujet de l'enregistrement de grands flux de donn\u00e9es, soulev\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">dans l'article pr\u00e9c\u00e9dent sur la partition<\/a><\/noindex>, examinons les moyens de <b>r\u00e9duire la taille \u00ab physique \u00bb des donn\u00e9es stock\u00e9es<\/b> dans PostgreSQL, et leur impact sur les performances du serveur.<\/p>\n<p>Il sera question de <b>r\u00e9glages TOAST et d'alignement des donn\u00e9es<\/b>. En moyenne, ces m\u00e9thodes permettront d'\u00e9conomiser relativement peu de ressources, mais \u2014 sans aucune modification du code de l'application.<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCependant, notre exp\u00e9rience s'est r\u00e9v\u00e9l\u00e9e assez productive \u00e0 cet \u00e9gard, car le stockage de pratiquement toute surveillance est par nature <b>principalement en mode ajout<\/b> en ce qui concerne les donn\u00e9es enregistr\u00e9es. Et si vous vous demandez comment enseigner \u00e0 la base \u00e0 \u00e9crire sur le disque \u00e0 la place de <b>200MB\/s<\/b> deux fois moins \u2014 je vous invite \u00e0 lire la suite.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Petits secrets des grandes donn\u00e9es<\/h2>\n<p>\nEn raison du profil de travail <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">de notre service<\/a><\/noindex>, il re\u00e7oit r\u00e9guli\u00e8rement des paquets de texte en provenance des journaux <b>des paquets de texte<\/b>.<\/p>\n<p>Et comme <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">le complexe SBIS<\/a><\/noindex>, dont nous surveillons les bases de donn\u00e9es, est un produit multifonctionnel avec des structures de donn\u00e9es complexes, les requ\u00eates <b>visent \u00e0 obtenir des performances maximales<\/b> sont donc tout \u00e0 fait <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">des \u00ab volumineux \u00bb avec une logique algorithmique complexe.<\/a><\/noindex>Ainsi, le volume de chaque requ\u00eate distincte ou du plan d'ex\u00e9cution r\u00e9sultant dans le journal que nous recevons se r\u00e9v\u00e8le \u00ab en moyenne \u00bb assez important.<\/p>\n<p>Voyons la structure d'une des tables dans lesquelles nous \u00e9crivons des donn\u00e9es \u00ab brutes \u00bb \u2014 c'est-\u00e0-dire le texte original des entr\u00e9es du journal :<\/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 -- cl\u00e9 de section\n    date\n, data -- le plus important\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nC'est un tableau typique (d\u00e9j\u00e0 partitionn\u00e9, bien s\u00fbr, c'est donc un mod\u00e8le de section), o\u00f9 le plus important est le texte. Parfois, il est assez volumineux.<\/p>\n<p>Rappelons que la taille \u00ab physique \u00bb d'un enregistrement dans PG ne peut pas d\u00e9passer une page de donn\u00e9es, mais la taille \u00ab logique \u00bb est une affaire totalement diff\u00e9rente. Pour enregistrer une valeur volumineuse (varchar\/text\/bytea) dans un champ, on utilise <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">la technologie TOAST<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL utilise une taille de page fixe (g\u00e9n\u00e9ralement 8 Ko) et ne permet pas aux tuples d'occuper plusieurs pages. Il est donc impossible de stocker directement de tr\u00e8s grandes valeurs de champs. Pour contourner cette limitation, les grandes valeurs de champs sont compress\u00e9es et\/ou divis\u00e9es en plusieurs lignes physiques. Cela se produit de mani\u00e8re transparente pour l'utilisateur et a peu d'impact sur la plupart du code du serveur. Cette m\u00e9thode est connue sous le nom de TOAST \u2026<\/p><\/blockquote>\n<p>\nEn r\u00e9alit\u00e9, pour chaque table avec des champs \u00ab potentiellement grands \u00bb, une <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">table associ\u00e9e est automatiquement<\/a><\/noindex> cr\u00e9\u00e9e pour \u00ab d\u00e9couper \u00bb<\/p>\n<pre><code class=\"sql\">chaque enregistrement \u00ab important \u00bb en segments de 2 Ko :<\/code><\/pre>\n<p>\nTOAST(\n  chunk_id\n    integer\n, chunk_seq\n    integer\n, chunk_data\n    bytea\n, PRIMARY KEY(chunk_id, chunk_seq)\n); <code>data<\/code>Autrement dit, si nous devons enregistrer une ligne avec une valeur \u00ab importante \u00bb <b>, alors l'enregistrement r\u00e9el se fera<\/b>.<\/p>\n<h4>non seulement dans la table principale et son PK, mais aussi dans TOAST et son PK<\/h4>\n<p>\nR\u00e9duire l'impact de TOAST <b>Mais la plupart des enregistrements ne sont pas si grands,<\/b> ils devraient tenir dans 8 Ko.<\/p>\n<p>\u2014 comment \u00e9conomiser l\u00e0-dessus ? <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>Ici, l'attribut<\/code><\/a><\/noindex> STORAGE<\/p>\n<blockquote>\n<ul>\n<li><b>de la colonne de la table nous vient en aide :<\/b> EXTENDED <b>permet \u00e0 la fois la compression et le stockage s\u00e9par\u00e9. C'est<\/b> la variante standard<\/li>\n<li><b>pour la plupart des types de donn\u00e9es compatibles avec TOAST. Une tentative de compression est d'abord r\u00e9alis\u00e9e, puis le stockage en dehors de la table est effectu\u00e9 si la ligne est toujours trop grande.<\/b> MAIN <b>permet la compression, mais pas le stockage s\u00e9par\u00e9. (En r\u00e9alit\u00e9, le stockage s\u00e9par\u00e9 sera toutefois effectu\u00e9 pour de telles colonnes, mais uniquement<\/b>en dernier recours<\/li>\n<\/ul>\n<\/blockquote>\n<p>, lorsque d'autres m\u00e9thodes ne peuvent pas r\u00e9duire la ligne pour qu'elle tienne dans la page.) <b>En fait, c'est exactement ce dont nous avons besoin pour le texte \u2014<\/b>comprimer au maximum, et si cela ne fonctionne vraiment pas \u2014 le faire sortir dans TOAST.<\/p>\n<pre><code class=\"sql\">Cela peut \u00eatre fait directement \u00ab \u00e0 la vol\u00e9e \u00bb, en une seule commande :<\/code><\/pre>\n<p><\/p>\n<h4>ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/h4>\n<p>\nComment \u00e9valuer l'effet <b>\u00c9tant donn\u00e9 que le flux de donn\u00e9es change chaque jour, nous ne pouvons pas comparer des chiffres absolus, mais en termes relatifs, moins nous<\/b> enregistrons dans TOAST \u2014 mieux c'est. Mais il y a un danger \u2014 plus notre volume \u00ab physique \u00bb de chaque enregistrement individuel est important, plus l'index devient \u00ab large \u00bb, car il faut couvrir un plus grand nombre de pages de donn\u00e9es.<\/p>\n<p>Section <b>avant les modifications<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37 Go (39%)\nTOAST = 54 Go (57%)\nPK    =  4 Go ( 4%)\n<\/code><\/pre>\n<p>\nSection <b>apr\u00e8s les modifications<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37 Go (67%)\nTOAST = 16 Go (29%)\nPK    =  2 Go ( 4%)<\/code><\/pre>\n<p>\nEn fait, nous <b>nous \u00e9crivons dans TOAST deux fois moins souvent<\/b>, ce qui a lib\u00e9r\u00e9 non seulement le disque, mais aussi le CPU :<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJe remarque que nous avons \u00e9galement commenc\u00e9 \u00e0 \u00ab lire \u00bb le disque moins souvent, pas seulement \u00e0 \u00ab \u00e9crire \u00bb \u2014 car lors de l'insertion d'un enregistrement dans une table, il faut aussi \u00ab lire \u00bb une partie de l'arbre de chaque index pour d\u00e9terminer sa future position.<\/p>\n<h2>\u00c0 qui fait bon vivre sur PostgreSQL 11<\/h2>\n<p>\nApr\u00e8s la mise \u00e0 jour vers PG11, nous avons d\u00e9cid\u00e9 de continuer le \u00ab tuning \u00bb de TOAST et avons remarqu\u00e9 qu'\u00e0 partir de cette version, un param\u00e8tre est devenu configurable <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>Le code de traitement de TOAST ne s'active que lorsque la taille de la cha\u00eene, qui doit \u00eatre stock\u00e9e dans la table, d\u00e9passe TOAST_TUPLE_THRESHOLD octets (g\u00e9n\u00e9ralement 2 Ko). Le code TOAST va compresser et\/ou d\u00e9placer les valeurs de champ en dehors de la table jusqu'\u00e0 ce que la taille de la cha\u00eene devienne inf\u00e9rieure \u00e0 TOAST_TUPLE_TARGET octets (variable, g\u00e9n\u00e9ralement \u00e9galement 2 Ko) ou que le volume ne puisse pas \u00eatre r\u00e9duit.<\/p><\/blockquote>\n<p>Nous avons d\u00e9cid\u00e9 que nos donn\u00e9es \u00e9taient g\u00e9n\u00e9ralement soit \u00ab tr\u00e8s courtes \u00bb, soit imm\u00e9diatement \u00ab tr\u00e8s longues \u00bb, donc nous avons d\u00e9cid\u00e9 de nous limiter \u00e0 la valeur minimale possible :<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nVoyons comment les nouveaux param\u00e8tres ont affect\u00e9 la charge du disque apr\u00e8s la reconfiguration :<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPas mal ! La moyenne <b>de la file d'attente du disque a diminu\u00e9<\/b> d'environ 1,5 fois, et le \u00ab taux d'occupation \u00bb du disque \u2014 de 20 % ! Mais cela a-t-il eu un impact sur le CPU ?<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDu moins, cela n'a pas empir\u00e9. Cependant, il est difficile d'en juger, car m\u00eame ces volumes ne peuvent pas augmenter la moyenne de charge CPU au-del\u00e0 <b>5%<\/b>.<\/p>\n<h2>Changer l'ordre des termes dans une somme\u2026 change le r\u00e9sultat !<\/h2>\n<p>\nComme on le sait, chaque sou est un rouble \u00e9conomis\u00e9, et avec nos volumes de stockage d'environ <b>10 To\/mois<\/b> , m\u00eame une petite optimisation peut apporter un bon profit. Ainsi, nous avons pr\u00eat\u00e9 attention \u00e0 la structure physique de nos donn\u00e9es \u2014 comment pr\u00e9cis\u00e9ment <b>les champs sont \u00ab plac\u00e9s \u00bb \u00e0 l'int\u00e9rieur de l'enregistrement<\/b> de chaque table.<\/p>\n<p>Parce qu'\u00e0 cause de <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">l'alignement des donn\u00e9es<\/a><\/noindex> cela affecte directement <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">le volume r\u00e9sultant<\/a><\/noindex>:<\/p>\n<blockquote><p>De nombreuses architectures pr\u00e9voient un alignement des donn\u00e9es sur les fronti\u00e8res des mots machine. Par exemple, sur un syst\u00e8me x86 32 bits, les entiers (type entier, occupant 4 octets) seront align\u00e9s sur la fronti\u00e8re des mots de 4 octets, tout comme les nombres \u00e0 virgule flottante double pr\u00e9cision (type double precision, 8 octets). Et sur un syst\u00e8me 64 bits, les valeurs double seront align\u00e9es sur la fronti\u00e8re des mots de 8 octets. C'est encore une autre raison d'incompatibilit\u00e9.<\/p>\n<p>En raison de l'alignement, la taille de la ligne de la table d\u00e9pend de l'ordre des champs. En g\u00e9n\u00e9ral, cet effet n'est pas tr\u00e8s perceptible, mais dans certains cas, il peut entra\u00eener une augmentation significative de la taille. Par exemple, si l'on m\u00e9lange des champs de types char(1) et integer, il y aura g\u00e9n\u00e9ralement 3 octets perdus entre eux.<\/p><\/blockquote>\n<p>\nCommen\u00e7ons par des mod\u00e8les synth\u00e9tiques :<\/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 octets\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 octets<\/code><\/pre>\n<p>\nD'o\u00f9 proviennent les quelques octets suppl\u00e9mentaires dans le premier cas ? C'est simple : <b>un smallint de 2 octets est align\u00e9 sur une fronti\u00e8re de 4 octets<\/b> avant le champ suivant, et quand il se trouve en dernier, il n'y a rien \u00e0 aligner et pas besoin de le faire.<\/p>\n<p>En th\u00e9orie, tout est bon et l'on peut d\u00e9placer les champs autant que l'on veut. V\u00e9rifions avec des donn\u00e9es r\u00e9elles \u00e0 partir de l'un des tableaux, dont la section journali\u00e8re occupe entre 10 et 15 Go.<\/p>\n<p>Structure d'origine :<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- H\u00e9rit\u00e9 de la table plan :  pack uuid NOT NULL,\n-- H\u00e9rit\u00e9 de la table plan :  recno smallint NOT NULL,\n-- H\u00e9rit\u00e9 de la table plan :  host uuid,\n-- H\u00e9rit\u00e9 de la table plan :  ts timestamp with time zone,\n-- H\u00e9rit\u00e9 de la table plan :  exectime numeric(32,3),\n-- H\u00e9rit\u00e9 de la table plan :  duration numeric(32,3),\n-- H\u00e9rit\u00e9 de la table plan :  bufint bigint,\n-- H\u00e9rit\u00e9 de la table plan :  bufmem bigint,\n-- H\u00e9rit\u00e9 de la table plan :  bufdsk bigint,\n-- H\u00e9rit\u00e9 de la table plan :  apn uuid,\n-- H\u00e9rit\u00e9 de la table plan :  ptr uuid,\n-- H\u00e9rit\u00e9 de la table 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>\nLa section apr\u00e8s changement d'ordre des colonnes \u2014 exactement <b>les m\u00eames champs, juste l'ordre est diff\u00e9rent<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- H\u00e9rit\u00e9 de la table plan :  dt date NOT NULL,\n-- H\u00e9rit\u00e9 de la table plan :  ts timestamp with time zone,\n-- H\u00e9rit\u00e9 de la table plan :  pack uuid NOT NULL,\n-- H\u00e9rit\u00e9 de la table plan :  recno smallint NOT NULL,\n-- H\u00e9rit\u00e9 de la table plan :  host uuid,\n-- H\u00e9rit\u00e9 de la table plan :  apn uuid,\n-- H\u00e9rit\u00e9 de la table plan :  ptr uuid,\n-- H\u00e9rit\u00e9 de la table plan :  bufint bigint,\n-- H\u00e9rit\u00e9 de la table plan :  bufmem bigint,\n-- H\u00e9rit\u00e9 de la table plan :  bufdsk bigint,\n-- H\u00e9rit\u00e9 de la table plan :  exectime numeric(32,3),\n-- H\u00e9rit\u00e9 de la table 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>\nLe volume total de la section est d\u00e9termin\u00e9 par le nombre de \u00abfaits\u00bb et d\u00e9pend uniquement des processus externes, donc divisons la taille de l'espace heap (<code>pg_relation_size<\/code>) sur le nombre d'enregistrements qu'il contient \u2014 nous obtiendrons <b>la taille moyenne de l'enregistrement stock\u00e9<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>moins 6 % du volume<\/b>, excellent !<\/p>\n<p>Mais tout n'est pas aussi rose, car <b>nous ne pouvons pas changer l'ordre des champs dans les index<\/b>, c'est pourquoi \u00ab en g\u00e9n\u00e9ral \u00bb (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 en fait, m\u00eame ici <b>nous avons \u00e9conomis\u00e9 1,5 %<\/b>, sans changer une seule ligne de code. C'est vrai !<\/p>\n<p><img decoding=\"async\" alt=\"\u00c9conomisons quelques centimes sur de gros volumes dans PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Je remarque que la configuration des champs mentionn\u00e9e ci-dessus n'est pas n\u00e9cessairement la plus optimale. Car certains blocs de champs ne doivent pas \u00eatre \u00ab d\u00e9chir\u00e9s \u00bb pour des raisons esth\u00e9tiques \u2014 par exemple, une paire <code>(pack, recno)<\/code>, qui est la cl\u00e9 primaire pour cette table.<\/p>\n<p>Dans l'ensemble, d\u00e9finir une \u00ab disposition minimale \u00bb des champs est une t\u00e2che relativement simple de \u00ab recherche \u00bb . Donc, vous pourriez obtenir de meilleurs r\u00e9sultats avec vos propres donn\u00e9es que nous \u2014 essayez !<br \/>\n<br \/>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\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\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\/fr\/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\udd47\u00c9conomisons un peu d'argent sur de grands volumes dans PostgreSQL | ProHoster","description":"En poursuivant le sujet de l'enregistrement de gros flux de donn\u00e9es, abord\u00e9 dans l'article pr\u00e9c\u00e9dent sur le partitionnement, nous examinerons les m\u00e9thodes \u00e0 notre disposition.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","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\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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/79039","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=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}