{"id":72875,"date":"2020-03-05T08:42:09","date_gmt":"2020-03-05T05:42:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika"},"modified":"2020-03-05T08:42:09","modified_gmt":"2020-03-05T05:42:09","slug":"zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","title":{"rendered":"Sant\u00e9 des index dans PostgreSQL vu par un d\u00e9veloppeur Java","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour.<\/p>\n<p><\/p>\n<p>Je m'appelle Vania et je suis d\u00e9veloppeur Java. Il se trouve que je travaille beaucoup avec PostgreSQL \u2013 je m'occupe de la configuration de la base de donn\u00e9es, de l'optimisation de la structure, de la performance et je joue un peu au DBA pendant le week-end.<\/p>\n<p><\/p>\n<p>R\u00e9cemment, j'ai remis en ordre plusieurs bases de donn\u00e9es dans nos microservices et j'ai \u00e9crit une biblioth\u00e8que Java <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\">pg-index-health<\/a><\/noindex>, qui facilite ce travail, fait gagner du temps et aide \u00e0 \u00e9viter certaines erreurs courantes commises par les d\u00e9veloppeurs. C'est justement de cette biblioth\u00e8que dont je vais parler aujourd'hui.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Sant\u00e9 des index dans PostgreSQL vu par un d\u00e9veloppeur Java\" src=\"\/wp-content\/uploads\/2020\/03\/e00bd48edf601f398bd7748754d48b80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"disclaimer\">Avertissement<\/h3>\n<p><\/p>\n<p>La version principale de PostgreSQL avec laquelle je travaille est la 10. Toutes les requ\u00eates SQL que j'utilise ont \u00e9galement \u00e9t\u00e9 v\u00e9rifi\u00e9es sur la version 11. La version minimale prise en charge est 9.6.<\/p>\n<p><\/p>\n<h3 id=\"predystoriya\">Contexte<\/h3>\n<p><\/p>\n<p>Tout a commenc\u00e9 il y a presque un an avec une situation \u00e9trange pour moi : la cr\u00e9ation concurrentielle d'un index a \u00e9chou\u00e9 avec une erreur. L'index lui-m\u00eame est rest\u00e9 dans un \u00e9tat non valide dans la base. L'analyse des logs a montr\u00e9 un manque de <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/runtime-config-resource\">temp_file_limit<\/a><\/noindex>. Et c'est parti... En creusant un peu plus, j'ai d\u00e9couvert un tas de probl\u00e8mes dans la configuration de la base de donn\u00e9es et, retroussant mes manches, avec des yeux p\u00e9tillants, je me suis mis \u00e0 les corriger.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"problema-pervaya--defoltnaya-konfiguraciya\">Le premier probl\u00e8me - la configuration par d\u00e9faut<\/h3>\n<p><\/p>\n<p>Peut-\u00eatre que la m\u00e9taphore de Postgres, qui peut \u00eatre lanc\u00e9 sur une cafeti\u00e8re, commence \u00e0 bien lasser tout le monde, mais... la configuration par d\u00e9faut soul\u00e8ve vraiment plusieurs questions. Au minimum, il faut faire attention \u00e0 <strong>maintenance_work_mem<\/strong>, <strong>temp_file_limit<\/strong>, <strong>statement_timeout<\/strong> et <strong>lock_timeout<\/strong>.<\/p>\n<p><\/p>\n<p>Dans notre cas <strong>maintenance_work_mem<\/strong> \u00e9tait par d\u00e9faut 64 Mo, tandis que <strong>temp_file_limit<\/strong> environ 2 Go - nous manquions tout simplement de m\u00e9moire pour cr\u00e9er un index sur une grande table.<\/p>\n<p><\/p>\n<p>C'est pourquoi, dans <strong>pg-index-health<\/strong> j'ai rassembl\u00e9 un certain nombre de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/dfbc7a37fc9c5f82957eeacdacd29a713fff7f51\/src\/main\/java\/io\/github\/mfvanek\/pg\/settings\/ImportantParam.java#L14\">param\u00e8tres cl\u00e9s<\/a><\/noindex>, selon moi, qu'il vaut la peine de configurer pour chaque base de donn\u00e9es.<\/p>\n<p><\/p>\n<h3 id=\"problema-vtoraya--dubliruyuschiesya-indeksy\">Le deuxi\u00e8me probl\u00e8me - les index dupliqu\u00e9s<\/h3>\n<p><\/p>\n<p>Nos bases vivent sur des disques SSD, et nous utilisons <em>HA<\/em>-une configuration avec plusieurs centres de donn\u00e9es, un h\u00f4te principal et <em>n<\/em>-un nombre variable de r\u00e9pliques. L'espace disque est une ressource tr\u00e8s pr\u00e9cieuse pour nous ; il est tout aussi important que la performance et la consommation de CPU. Donc, d'un c\u00f4t\u00e9, nous avons besoin d'index pour des lectures rapides, mais de l'autre, nous ne voulons pas voir d'index superflus dans la base de donn\u00e9es, car ils consomment de l'espace et ralentissent la mise \u00e0 jour des donn\u00e9es.<\/p>\n<p><\/p>\n<p>Et donc, apr\u00e8s avoir restaur\u00e9 tous les <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/invalid_indexes.sql\">index non valides<\/a><\/noindex> et apr\u00e8s avoir regard\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=aaecM4wKdhY\">les pr\u00e9sentations d'Oleg Bartunov<\/a><\/noindex>, j'ai d\u00e9cid\u00e9 de faire un \u00ab grand \u00bb nettoyage. Il s'est av\u00e9r\u00e9 que les d\u00e9veloppeurs n'aiment pas lire la documentation de la base de donn\u00e9es. Ils n'aiment vraiment pas. Cela entra\u00eene deux erreurs typiques : un index cr\u00e9\u00e9 manuellement sur la cl\u00e9 primaire et un index similaire \u00ab manuel \u00bb sur une colonne unique. Le fait est qu'ils ne sont pas n\u00e9cessaires \u2013 Postgres s'en occupera tout seul. Ces index peuvent \u00eatre supprim\u00e9s sans h\u00e9sitation, et un diagnostic a \u00e9t\u00e9 mis en place pour cela. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/duplicated_indexes.sql\">index_dupliqu\u00e9s<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"problema-tretya--peresekayuschiesya-indeksy\">Probl\u00e8me trois \u2013 index qui se chevauchent<\/h3>\n<p><\/p>\n<p>La plupart des d\u00e9veloppeurs d\u00e9butants cr\u00e9ent des index sur une seule colonne. Progressivement, apr\u00e8s avoir go\u00fbt\u00e9 \u00e0 cette t\u00e2che, les gens commencent \u00e0 optimiser leurs requ\u00eates et \u00e0 ajouter des index plus complexes comprenant plusieurs colonnes. C'est ainsi qu'apparaissent les index sur les colonnes <em>A<\/em>, <em>A+B<\/em>, <em>A+B+C<\/em> etc. Les deux premiers de ces index peuvent \u00eatre facilement supprim\u00e9s, car ils sont des pr\u00e9fixes du troisi\u00e8me. Cela \u00e9conomise \u00e9galement une quantit\u00e9 consid\u00e9rable d'espace disque et un diagnostic est disponible pour cela. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/intersected_indexes.sql\">index_recrois\u00e9s<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"problema-chetvertaya--vneshnie-klyuchi-bez-indeksov\">Probl\u00e8me quatre \u2013 cl\u00e9s \u00e9trang\u00e8res sans index<\/h3>\n<p><\/p>\n<p>Postgres permet de cr\u00e9er des contraintes de cl\u00e9 \u00e9trang\u00e8re sans sp\u00e9cifier d'index de support. Dans de nombreuses situations, cela n'est pas un probl\u00e8me et peut m\u00eame ne pas se manifester... Jusqu'\u00e0 un certain moment...<\/p>\n<p><\/p>\n<p>C'\u00e9tait notre cas : \u00e0 un certain moment, un job, s'ex\u00e9cutant selon un emploi du temps et nettoyant la base des commandes de test, a commenc\u00e9 \u00e0 \u00ab saturer \u00bb notre h\u00f4te master. Le processeur et l'IO s'envolaient, les requ\u00eates ralentissaient et \u00e9taient interrompues par des timeouts, le service affichait des erreurs 500. Une analyse rapide <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/monitoring-stats\">pg_stat_activity<\/a><\/noindex> a montr\u00e9 que les requ\u00eates du type :<\/p>\n<p><\/p>\n<pre><code class=\"sql\">supprimer de &lt;table&gt; o&ugrave; id dans (&hellip;)<\/code><\/pre>\n<p><\/p>\n<p>Tout en ayant l'index sur id dans la table cible, il y avait naturellement peu de suppressions selon la condition. On aurait pens\u00e9 que tout devait fonctionner, mais, h\u00e9las, \u00e7a ne fonctionnait pas.<\/p>\n<p><\/p>\n<p>Le merveilleux <strong>explain analyze<\/strong> est venu \u00e0 la rescousse, et a r\u00e9v\u00e9l\u00e9 qu'en plus de la suppression des enregistrements dans la table cible, une v\u00e9rification de l'int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle \u00e9tait \u00e9galement effectu\u00e9e, et sur l'une des tables associ\u00e9es, cette v\u00e9rification tombait dans <em>une analyse s\u00e9quentielle<\/em> en raison de l'absence de l'index appropri\u00e9. Ainsi, le diagnostic <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/foreign_keys_without_index.sql\">cl\u00e9s_\u00e9trang\u00e8res_sans_index<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"problema-pyataya--null-value-v-indeksah\">Probl\u00e8me cinq \u2013 valeur nulle dans les index<\/h3>\n<p><\/p>\n<p>Par d\u00e9faut, Postgres inclut les valeurs nulles dans les index btree, mais elles ne sont g\u00e9n\u00e9ralement pas n\u00e9cessaires. C'est pourquoi je m'efforce de supprimer ces nulls (diagnostic <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/indexes_with_null_values.sql\">index_avec_valeurs_nuls<\/a><\/noindex>), en cr\u00e9ant des index partiels sur les colonnes nullable du type <code>where <A> is not null<\/code>. De cette fa\u00e7on, j'ai r\u00e9ussi \u00e0 r\u00e9duire la taille de l'un de nos index de 1877 Mo \u00e0 16 Ko. Et dans l'un des services, la taille de la base de donn\u00e9es a diminu\u00e9 au total de 16 % (soit 4,3 Go en chiffres absolus) en raison de l'exclusion des valeurs nulles des index. Une \u00e9conomie d'espace disque colossale avec des am\u00e9liorations assez simples. \ud83d\ude42 <\/p>\n<p><\/p>\n<h3 id=\"problema-shestaya--otsutstvie-pervichnyh-klyuchey\">Probl\u00e8me six \u2013 absence de cl\u00e9s primaires<\/h3>\n<p><\/p>\n<p>En raison des particularit\u00e9s du m\u00e9canisme <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/442804\/\">MVCC dans Postgres<\/a><\/noindex> il est possible qu'une telle situation survienne, <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/169939\/\">le gonflement<\/a><\/noindex>, lorsque la taille de votre table augmente rapidement en raison d'un grand nombre d'enregistrements morts. Je pensais na\u00efvement que cela ne nous arriverait pas et qu'avec notre base de donn\u00e9es, cela ne se produirait pas, apr\u00e8s tout, nous sommes, oh l\u00e0 l\u00e0!!!, de bons d\u00e9veloppeurs... Comme j'\u00e9tais na\u00eff et stupide\u2026<\/p>\n<p><\/p>\n<p>Un beau jour, une migration a d\u00e9cid\u00e9 de mettre \u00e0 jour tous les enregistrements dans une grande table souvent utilis\u00e9e. Nous avons obtenu +100 Go \u00e0 la taille de la table sans raison. C'\u00e9tait incroyablement frustrant, mais nos m\u00e9saventures ne se sont pas arr\u00eat\u00e9es l\u00e0. Apr\u00e8s que l'autovacuum sur cette table a dur\u00e9 15 heures, il est devenu clair que l'espace physique ne reviendrait pas. Nous ne pouvions pas arr\u00eater le service et effectuer un VACUUM FULL, donc nous avons d\u00e9cid\u00e9 d'utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/noindex>. Et l\u00e0, il s'est av\u00e9r\u00e9 que <em>pg_repack<\/em> ne peut pas traiter les tables sans cl\u00e9 primaire ou autre contrainte d'unicit\u00e9, et notre table n'en avait pas. C'est ainsi qu'est n\u00e9e le diagnostic <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/tables_without_primary_key.sql\">tables_without_primary_key<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Dans la version de la biblioth\u00e8que <strong>0.1.5<\/strong> la possibilit\u00e9 de collecter des donn\u00e9es sur le bloat des tables et des index a \u00e9t\u00e9 ajout\u00e9e et d\u2019y r\u00e9agir \u00e0 temps.<\/p>\n<p><\/p>\n<h3 id=\"problemy-sem-i-vosem--nehvatka-indeksov-i-neispolzuemye-indeksy\">Probl\u00e8mes sept et huit \u2013 manque d'index et index inutilis\u00e9s<\/h3>\n<p><\/p>\n<p>Les deux diagnostics suivants \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/tables_with_missing_indexes.sql\">tables_with_missing_indexes<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/unused_indexes.sql\">unused_indexes<\/a><\/noindex> \u2013 sont apparus dans leur version finale relativement r\u00e9cemment. En fait, on ne pouvait pas simplement les ajouter comme \u00e7a.<\/p>\n<p><\/p>\n<p>Comme je l'ai d\u00e9j\u00e0 \u00e9crit, nous utilisons une configuration avec plusieurs r\u00e9pliques, et la charge de lecture sur diff\u00e9rents h\u00f4tes est fondamentalement diff\u00e9rente. Au final, cela cr\u00e9e une situation o\u00f9 certaines tables et index sur certains h\u00f4tes ne sont pratiquement pas utilis\u00e9s, et pour l'analyse, il est n\u00e9cessaire de collecter des statistiques depuis tous les h\u00f4tes du cluster. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/dfbc7a37fc9c5f82957eeacdacd29a713fff7f51\/src\/main\/java\/io\/github\/mfvanek\/pg\/index\/health\/IndexesHealth.java#L165\">Il est \u00e9galement n\u00e9cessaire de r\u00e9initialiser les statistiques<\/a><\/noindex> sur chaque h\u00f4te du cluster, on ne peut pas le faire uniquement sur le ma\u00eetre.<\/p>\n<p><\/p>\n<p>Cette approche nous a permis d'\u00e9conomiser plusieurs dizaines de gigaoctets en supprimant des index qui n'\u00e9taient jamais utilis\u00e9s, tout en ajoutant des index manquants sur des tables rarement utilis\u00e9es.<\/p>\n<p><\/p>\n<h3 id=\"v-kachestve-zaklyucheniya\">En conclusion<\/h3>\n<p><\/p>\n<p>Il va de soi que pour pratiquement tous les diagnostics, il est possible de configurer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/dfbc7a37fc9c5f82957eeacdacd29a713fff7f51\/src\/main\/java\/io\/github\/mfvanek\/pg\/index\/health\/logger\/Exclusions.java#L26\">une liste d'exceptions<\/a><\/noindex>. Cela permet d'impl\u00e9menter rapidement des v\u00e9rifications dans votre application, pr\u00e9venant ainsi l'apparition de nouvelles erreurs, et de corriger progressivement les anciennes.<\/p>\n<p><\/p>\n<p>Certaines v\u00e9rifications peuvent \u00eatre effectu\u00e9es directement dans les tests fonctionnels imm\u00e9diatement apr\u00e8s l'application des migrations de la base de donn\u00e9es. Et c'est probablement l'une des fonctionnalit\u00e9s les plus puissantes de ma biblioth\u00e8que. Vous pouvez consulter un exemple d'utilisation dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health-demo\/blob\/master\/src\/test\/java\/io\/github\/mfvanek\/pg\/index\/health\/demo\/IndexesMaintenanceTest.java\">une d\u00e9mo<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Les v\u00e9rifications d'index non utilis\u00e9s ou manquants, ainsi que celles concernant le bloat, ne sont pertinentes que sur une v\u00e9ritable base de donn\u00e9es. Les valeurs collect\u00e9es peuvent \u00eatre enregistr\u00e9es dans <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\">ClickHouse<\/a><\/noindex> ou envoy\u00e9es \u00e0 un syst\u00e8me de surveillance.<\/p>\n<p><\/p>\n<p>J'esp\u00e8re sinc\u00e8rement que <strong>pg-index-health<\/strong> sera utile et recherch\u00e9e. Vous pouvez \u00e9galement contribuer au d\u00e9veloppement de la biblioth\u00e8que en signalant des probl\u00e8mes rencontr\u00e9s et en proposant de nouveaux diagnostics.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/490824\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u043d\u044f, \u0438 \u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044f \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0441 PostgreSQL \u2013 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0411\u0414, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u0430\u044e \u0432 DBA \u043f\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u043c. \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u044f \u043f\u0440\u0438\u0432\u0451\u043b \u0432 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b java-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 pg-index-health, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u044d\u0442\u0443 \u0440\u0430\u0431\u043e\u0442\u0443, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043c\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":72876,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-72875","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\u0438\u0432\u0435\u0442. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u043d\u044f, \u0438 \u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.\" \/>\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\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika\" \/>\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\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 PostgreSQL \u0433\u043b\u0430\u0437\u0430\u043c\u0438 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u043d\u044f, \u0438 \u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika\" \/>\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-03-05T05:42:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-05T05:42:09+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\udd47Sant\u00e9 des index dans PostgreSQL \u00e0 travers les yeux d'un d\u00e9veloppeur Java | ProHoster","description":"Bonjour. Je m'appelle Vanya et je suis d\u00e9veloppeur Java.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","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\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0432 PostgreSQL \u0433\u043b\u0430\u0437\u0430\u043c\u0438 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u0430\u043d\u044f, \u0438 \u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","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-03-05T05:42:09+00:00","article:modified_time":"2020-03-05T05:42:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"72875","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 18:43:29","updated":"2022-09-27 23:10:08","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\/72875","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=72875"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/72875\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/72876"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=72875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=72875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=72875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}