{"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\/pt\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","title":{"rendered":"A sa\u00fade dos \u00edndices no PostgreSQL sob a perspectiva de um desenvolvedor Java","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1.<\/p>\n<p><\/p>\n<p>Meu nome \u00e9 Vanya e sou desenvolvedor Java. Acabei trabalhando muito com PostgreSQL \u2013 fa\u00e7o configura\u00e7\u00e3o de Banco de Dados, otimiza\u00e7\u00e3o de estrutura, desempenho e um pouco de DBA nos fins de semana.<\/p>\n<p><\/p>\n<p>Recentemente, organizei v\u00e1rias bases de dados em nossos microsservi\u00e7os e escrevi uma biblioteca Java. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\">pg-index-health<\/a><\/noindex>, que facilita esse trabalho, economiza meu tempo e ajuda a evitar alguns erros comuns cometidos pelos desenvolvedores. \u00c9 sobre essa biblioteca que falarei hoje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"A sa\u00fade dos \u00edndices no PostgreSQL sob a perspectiva de um desenvolvedor Java\" src=\"\/wp-content\/uploads\/2020\/03\/e00bd48edf601f398bd7748754d48b80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"disclaimer\">Aviso Legal<\/h3>\n<p><\/p>\n<p>A vers\u00e3o principal do PostgreSQL com a qual trabalho \u00e9 a 10. Todas as consultas SQL que uso tamb\u00e9m foram testadas na vers\u00e3o 11. A vers\u00e3o m\u00ednima suportada \u00e9 9.6.<\/p>\n<p><\/p>\n<h3 id=\"predystoriya\">Antecedentes<\/h3>\n<p><\/p>\n<p>Tudo come\u00e7ou quase um ano atr\u00e1s com uma situa\u00e7\u00e3o estranha para mim: a cria\u00e7\u00e3o concorrente de um \u00edndice em um lugar tranquilo terminou com um erro. O pr\u00f3prio \u00edndice, como costuma acontecer, permaneceu em um estado inv\u00e1lido no banco. A an\u00e1lise dos logs mostrou a falta de <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/runtime-config-resource\">temp_file_limit<\/a><\/noindex>. E da\u00ed em diante\u2026 Ao investigar mais a fundo, descobri um monte de problemas na configura\u00e7\u00e3o do Banco de Dados e, arrega\u00e7ando as mangas, com brilho nos olhos, comecei a consert\u00e1-los.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"problema-pervaya--defoltnaya-konfiguraciya\">O primeiro problema \u2013 configura\u00e7\u00e3o padr\u00e3o<\/h3>\n<p><\/p>\n<p>Talvez a met\u00e1fora sobre o Postgres que pode ser executado em uma cafeteira j\u00e1 esteja bastante batida, mas\u2026 a configura\u00e7\u00e3o padr\u00e3o realmente levanta uma s\u00e9rie de quest\u00f5es. Pelo menos, vale a pena prestar aten\u00e7\u00e3o em <strong>maintenance_work_mem<\/strong>, <strong>temp_file_limit<\/strong>, <strong>statement_timeout<\/strong> e <strong>lock_timeout<\/strong>.<\/p>\n<p><\/p>\n<p>No nosso caso <strong>maintenance_work_mem<\/strong> era por padr\u00e3o 64 MB, enquanto <strong>temp_file_limit<\/strong> algo em torno de 2 GB \u2013 basicamente nos faltava mem\u00f3ria para criar um \u00edndice em uma tabela grande.<\/p>\n<p><\/p>\n<p>Portanto, em <strong>pg-index-health<\/strong> compilei uma s\u00e9rie 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\">par\u00e2metros-chave<\/a><\/noindex>, na minha opini\u00e3o, que vale a pena ajustar para cada Banco de Dados.<\/p>\n<p><\/p>\n<h3 id=\"problema-vtoraya--dubliruyuschiesya-indeksy\">O segundo problema \u2013 \u00edndices duplicados<\/h3>\n<p><\/p>\n<p>Nossos bancos de dados vivem em discos SSD, e usamos <em>HA<\/em>-configura\u00e7\u00e3o com v\u00e1rios data centers, um host mestre e <em>n<\/em>-um n\u00famero de r\u00e9plicas. O espa\u00e7o no disco \u00e9 um recurso muito valioso para n\u00f3s; \u00e9 t\u00e3o importante quanto o desempenho e o consumo de CPU. Portanto, por um lado, precisamos de \u00edndices para leitura r\u00e1pida, enquanto, por outro lado, n\u00e3o queremos ver \u00edndices desnecess\u00e1rios no Banco de Dados, pois eles consomem espa\u00e7o e desaceleram as atualiza\u00e7\u00f5es de dados.<\/p>\n<p><\/p>\n<p>Portanto, ao restaurar todos os <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/invalid_indexes.sql\">\u00edndices inv\u00e1lidos<\/a><\/noindex> e observando <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=aaecM4wKdhY\">as palestras de Oleg Bartunov<\/a><\/noindex>, eu decidi fazer uma \"grande\" limpeza. Acontece que os desenvolvedores n\u00e3o gostam de ler a documenta\u00e7\u00e3o do banco de dados. Eles realmente n\u00e3o gostam. Por causa disso, surgem dois erros t\u00edpicos - um \u00edndice criado manualmente na chave prim\u00e1ria e um \u00edndice \"manual\" semelhante na coluna \u00fanica. A quest\u00e3o \u00e9 que eles n\u00e3o s\u00e3o necess\u00e1rios - o Postgres faz isso sozinho. Esses \u00edndices podem ser removidos sem problemas, e para isso existe um diagn\u00f3stico. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/duplicated_indexes.sql\">duplicated_indexes<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"problema-tretya--peresekayuschiesya-indeksy\">O terceiro problema - \u00edndices sobrepostos<\/h3>\n<p><\/p>\n<p>A maioria dos desenvolvedores iniciantes cria \u00edndices em uma \u00fanica coluna. Gradualmente, ap\u00f3s experimentarem isso, as pessoas come\u00e7am a otimizar suas consultas e adicionar \u00edndices mais complexos que incluem v\u00e1rias colunas. Assim, surgem \u00edndices para as colunas <em>A<\/em>, <em>A+B<\/em>, <em>A+B+C<\/em> etc. Os dois primeiros desses \u00edndices podem ser descartados, pois s\u00e3o prefixos do terceiro. Isso tamb\u00e9m economiza bastante espa\u00e7o em disco e para isso existe um diagn\u00f3stico. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/intersected_indexes.sql\">intersected_indexes<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"problema-chetvertaya--vneshnie-klyuchi-bez-indeksov\">O quarto problema - chaves estrangeiras sem \u00edndices<\/h3>\n<p><\/p>\n<p>O Postgres permite a cria\u00e7\u00e3o de restri\u00e7\u00f5es de chaves estrangeiras sem especificar um \u00edndice de suporte. Em muitas situa\u00e7\u00f5es, isso n\u00e3o representa um problema e pode n\u00e3o se manifestar\u2026 At\u00e9 que uma hora\u2026<\/p>\n<p><\/p>\n<p>Foi o que aconteceu conosco: em algum momento, um job que executava periodicamente e limpava a base de pedidos de teste come\u00e7ou a \"sobrecarregar\" nosso master host. O CPU e I\/O dispararam, as consultas ficaram lentas e foram interrompidas por timeout, e o servi\u00e7o come\u00e7ou a retornar erro 500. Uma r\u00e1pida an\u00e1lise <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/monitoring-stats\">pg_stat_activity<\/a><\/noindex> mostrou que as consultas do tipo estavam travadas:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">deletar de &lt;table&gt; onde id em (&hellip;)<\/code><\/pre>\n<p><\/p>\n<p>Enquanto isso, o \u00edndice por id na tabela alvo, naturalmente, existia, e os registros estavam sendo removidos com poucas condi\u00e7\u00f5es. Parecia que tudo deveria funcionar, mas, infelizmente, n\u00e3o funcionava.<\/p>\n<p><\/p>\n<p>Veio em aux\u00edlio o maravilhoso <strong>explain analyze<\/strong> e revelou que, al\u00e9m da remo\u00e7\u00e3o de registros na tabela alvo, ainda estava ocorrendo uma verifica\u00e7\u00e3o de integridade referencial, e em uma das tabelas relacionadas, essa verifica\u00e7\u00e3o falhava em um <em>sequential scan<\/em> devido \u00e0 aus\u00eancia de um \u00edndice adequado. Assim, surgiu o diagn\u00f3stico. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/foreign_keys_without_index.sql\">foreign_keys_without_index<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"problema-pyataya--null-value-v-indeksah\">O quinto problema - valor nulo em \u00edndices<\/h3>\n<p><\/p>\n<p>Por padr\u00e3o, o Postgres inclui valores nulos em \u00edndices btree, mas eles geralmente n\u00e3o s\u00e3o necess\u00e1rios. Portanto, eu me esfor\u00e7o para remover esses nulos (diagn\u00f3stico <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/indexes_with_null_values.sql\">indexes_with_null_values<\/a><\/noindex>), criando \u00edndices parciais em colunas que aceitam nulos do tipo <code>where <A> is not null<\/code>. Dessa forma, consegui reduzir o tamanho de um dos nossos \u00edndices de 1877 MB para 16 KB. E em um dos servi\u00e7os, o tamanho total do banco de dados foi reduzido em 16% (4,3 GB em n\u00fameros absolutos) ao excluir valores nulos dos \u00edndices. Uma economia colossal de espa\u00e7o em disco com melhorias bastante simples. \ud83d\ude42 <\/p>\n<p><\/p>\n<h3 id=\"problema-shestaya--otsutstvie-pervichnyh-klyuchey\">Problema seis \u2013 aus\u00eancia de chaves prim\u00e1rias<\/h3>\n<p><\/p>\n<p>Devido \u00e0s particularidades do mecanismo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/442804\/\">MVCC no Postgres<\/a><\/noindex> , pode ocorrer uma situa\u00e7\u00e3o em que <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/169939\/\">bloat<\/a><\/noindex>, quando o tamanho da sua tabela cresce rapidamente devido a um grande n\u00famero de registros mortos. Eu ingenuamente pensei que isso n\u00e3o nos afetaria e que nosso banco n\u00e3o enfrentaria tal problema, afinal, n\u00f3s, uau!!!, somos desenvolvedores normais... Que tolo e ing\u00eanuo eu fui...<\/p>\n<p><\/p>\n<p>Certa vez, uma maravilhosa migra\u00e7\u00e3o atualizou todos os registros em uma tabela grande e frequentemente utilizada. Recebemos +100 GB no tamanho da tabela do nada. Foi extremamente frustrante, mas nossas desventuras n\u00e3o terminaram a\u00ed. Depois que o autov\u00e1cuo foi conclu\u00eddo nessa tabela, ap\u00f3s 15 horas, ficou claro que o espa\u00e7o f\u00edsico n\u00e3o retornaria. N\u00e3o pudemos parar o servi\u00e7o para fazer um VACUUM FULL, ent\u00e3o decidimos usar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/noindex>. E ent\u00e3o ficou claro que <em>pg_repack<\/em> n\u00e3o consegue lidar com tabelas sem chave prim\u00e1ria ou outra restri\u00e7\u00e3o de exclusividade, e nossa tabela n\u00e3o tinha chave prim\u00e1ria. Assim nasceu o diagn\u00f3stico <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>Na vers\u00e3o da biblioteca <strong>0.1.5<\/strong> foi adicionada a capacidade de coletar dados sobre o bloat de tabelas e \u00edndices e reagir a isso em tempo h\u00e1bil.<\/p>\n<p><\/p>\n<h3 id=\"problemy-sem-i-vosem--nehvatka-indeksov-i-neispolzuemye-indeksy\">Problemas sete e oito \u2013 falta de \u00edndices e \u00edndices n\u00e3o utilizados<\/h3>\n<p><\/p>\n<p>Os dois diagn\u00f3sticos seguintes \u2013 <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> e <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 em sua forma final, surgiram relativamente recentemente. A quest\u00e3o \u00e9 que n\u00e3o era poss\u00edvel simplesmente adicion\u00e1-los.<\/p>\n<p><\/p>\n<p>Como j\u00e1 mencionei, usamos uma configura\u00e7\u00e3o com v\u00e1rias r\u00e9plicas, e a carga de leitura em diferentes hosts \u00e9 fundamentalmente diferente. O resultado \u00e9 uma situa\u00e7\u00e3o em que algumas tabelas e \u00edndices em alguns hosts praticamente n\u00e3o s\u00e3o utilizados, e para an\u00e1lise \u00e9 necess\u00e1rio coletar estat\u00edsticas de todos os hosts do 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\">Redefinir estat\u00edsticas<\/a><\/noindex> tamb\u00e9m precisa ser feito em cada host do cluster, n\u00e3o \u00e9 poss\u00edvel fazer isso apenas no mestre.<\/p>\n<p><\/p>\n<p>Essa abordagem nos permitiu economizar v\u00e1rias dezenas de gigabytes ao remover \u00edndices que nunca foram utilizados, al\u00e9m de adicionar os \u00edndices ausentes em tabelas raramente usadas.<\/p>\n<p><\/p>\n<h3 id=\"v-kachestve-zaklyucheniya\">Em conclus\u00e3o<\/h3>\n<p><\/p>\n<p>Claro, praticamente todas as diagn\u00f3sticas podem ser configuradas <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\">uma lista de exce\u00e7\u00f5es<\/a><\/noindex>. Dessa forma, \u00e9 poss\u00edvel implementar rapidamente verifica\u00e7\u00f5es em seu aplicativo, prevenindo o surgimento de novos erros e, em seguida, corrigindo gradualmente os antigos.<\/p>\n<p><\/p>\n<p>Parte das diagn\u00f3sticas pode ser executada j\u00e1 nos testes funcionais logo ap\u00f3s a aplica\u00e7\u00e3o das migra\u00e7\u00f5es do banco de dados. E esta \u00e9, sem d\u00favida, uma das funcionalidades mais poderosas da minha biblioteca. Um exemplo de uso pode ser visto em <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\">demonstra\u00e7\u00e3o<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Verifica\u00e7\u00f5es de \u00edndices n\u00e3o utilizados ou ausentes, bem como de bloat, devem ser realizadas somente em um banco de dados real. Os valores coletados podem ser registrados em <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\">ClickHouse<\/a><\/noindex> ou enviados para o sistema de monitoramento.<\/p>\n<p><\/p>\n<p>Espero muito que <strong>pg-index-health<\/strong> seja \u00fatil e procurada. Voc\u00ea tamb\u00e9m pode contribuir para o desenvolvimento da biblioteca, reportando problemas encontrados e sugerindo novas diagn\u00f3sticas.<\/p>\n<p>Fonte: <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.3 - 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\/pt\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Sa\u00fade dos \u00edndices em PostgreSQL na vis\u00e3o de um desenvolvedor Java | ProHoster","description":"Ol\u00e1. Meu nome \u00e9 Vanya e sou desenvolvedor Java.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/72875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=72875"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/72875\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/72876"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=72875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=72875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=72875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}