{"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\/ro\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","title":{"rendered":"Starea indicelui \u00een PostgreSQL prin ochii unui dezvoltator Java","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Salut.<\/p>\n<p><\/p>\n<p>M\u0103 numesc Vania \u0219i sunt dezvoltator Java. A\u0219a se face c\u0103 lucrez mult cu PostgreSQL \u2013 m\u0103 ocup de configurarea Bazei de Date, optimizarea structurii, performan\u021bei \u0219i m\u0103 joc pu\u021bin de DBA \u00een weekenduri.<\/p>\n<p><\/p>\n<p>\u00cen ultimul timp am pus \u00een ordine c\u00e2teva baze de date \u00een microserviciile noastre \u0219i am scris o bibliotec\u0103 java <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\">pg-index-health<\/a><\/noindex>, care faciliteaz\u0103 aceast\u0103 munc\u0103, economisind timp \u0219i ajut\u00e2ndu-m\u0103 s\u0103 evit unele gre\u0219eli comune f\u0103cute de dezvoltatori. Despre aceast\u0103 bibliotec\u0103 va fi vorba ast\u0103zi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Starea indicelui \u00een PostgreSQL prin ochii unui dezvoltator Java\" src=\"\/wp-content\/uploads\/2020\/03\/e00bd48edf601f398bd7748754d48b80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"disclaimer\">Declinarea<\/h3>\n<p><\/p>\n<p>Versiunea principal\u0103 a PostgreSQL cu care lucrez este 10. Toate interog\u0103rile SQL pe care le folosesc sunt, de asemenea, testate pe versiunea 11. Versiunea minim\u0103 suportat\u0103 este 9.6.<\/p>\n<p><\/p>\n<h3 id=\"predystoriya\">Povestea<\/h3>\n<p><\/p>\n<p>Totul a \u00eenceput acum aproape un an cu o situa\u021bie ciudat\u0103 pentru mine: crearea concurent\u0103 a unui index pe un fond normal s-a \u00eencheiat cu o eroare. Indexul, ca de obicei, a r\u0103mas \u00een stare invalid\u0103 \u00een baz\u0103. Analiza logurilor a ar\u0103tat o lips\u0103 de <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/runtime-config-resource\">temp_file_limit<\/a><\/noindex>. \u0218i a \u00eenceput... S\u0103p\u00e2nd mai ad\u00e2nc, am descoperit o mul\u021bime de probleme \u00een configura\u021bia Bazei de Date \u0219i, cu m\u00e2necile suflecate, am \u00eenceput s\u0103 le repar.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"problema-pervaya--defoltnaya-konfiguraciya\">Problema \u00eent\u00e2i \u2013 configura\u021bia implicit\u0103<\/h3>\n<p><\/p>\n<p>Probabil c\u0103 metafora despre Postgres care poate fi rulat pe o cafea s-a \u00eenvechit, dar... configura\u021bia implicit\u0103 ridic\u0103 \u00eentr-adev\u0103r o serie de \u00eentreb\u0103ri. \u00cen cel mai bun caz, merit\u0103 s\u0103 acord\u0103m aten\u021bie la <strong>maintenance_work_mem<\/strong>, <strong>temp_file_limit<\/strong>, <strong>statement_timeout<\/strong> \u0219i <strong>lock_timeout<\/strong>.<\/p>\n<p><\/p>\n<p>\u00cen cazul nostru <strong>maintenance_work_mem<\/strong> era 64 MB \u00een mod implicit, iar <strong>temp_file_limit<\/strong> aproximativ 2 GB \u2013 pur \u0219i simplu nu aveam suficient\u0103 memorie pentru a crea un index pe o mas\u0103 mare.<\/p>\n<p><\/p>\n<p>A\u0219a c\u0103 \u00een <strong>pg-index-health<\/strong> am adunat o serie 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\">parametrii<\/a><\/noindex>, din punctul meu de vedere, esen\u021biali, care merit\u0103 s\u0103 fie ajusta\u021bi pentru fiecare Baz\u0103 de Date.<\/p>\n<p><\/p>\n<h3 id=\"problema-vtoraya--dubliruyuschiesya-indeksy\">Problema a doua \u2013 indec\u0219i duplicat<\/h3>\n<p><\/p>\n<p>Bazele noastre tr\u0103iesc pe SSD-uri \u0219i folosim <em>HA<\/em>-configura\u021bie cu mai multe centre de date, master-host \u0219i <em>n<\/em>-un num\u0103r de replici. Spa\u021biul pe disc este un resurs\u0103 extrem de valoroas\u0103 pentru noi; este la fel de important ca performan\u021ba \u0219i consumul de CPU. Prin urmare, pe de o parte, avem nevoie de indec\u0219i pentru citiri rapide, iar pe de alt\u0103 parte, nu vrem s\u0103 vedem indec\u0219i suplimentari \u00een Baza de Date, deoarece ace\u0219tia ocup\u0103 spa\u021biu \u0219i \u00eencetinesc actualizarea datelor.<\/p>\n<p><\/p>\n<p>\u0218i a\u0219a, dup\u0103 ce am restaurat toate <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/invalid_indexes.sql\">indec\u0219ii invalizi<\/a><\/noindex> \u0219i m-am uitat la <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=aaecM4wKdhY\">prezent\u0103rile lui Oleg Bartunov<\/a><\/noindex>, am decis s\u0103 fac o \u201emare\u201d cur\u0103\u021bare. S-a dovedit c\u0103 dezvoltatorii nu iubesc s\u0103 citeasc\u0103 documenta\u021bia pentru baza de date. Deloc. Din aceast\u0103 cauz\u0103 apar dou\u0103 erori tipice - un index creat manual pe cheia primar\u0103 \u0219i un index similar \u201emanual\u201d pe o coloan\u0103 unic\u0103. Problema este c\u0103 acestea nu sunt necesare - Postgres se ocup\u0103 de tot. Aceste indec\u0219i pot fi elimina\u021bi f\u0103r\u0103 ezitare, iar pentru aceasta a ap\u0103rut diagnosticul <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\">Problema a treia - indec\u0219i care se suprapun<\/h3>\n<p><\/p>\n<p>Majoritatea dezvoltatorilor \u00eencep\u0103tori creeaz\u0103 indec\u0219i pe o singur\u0103 coloan\u0103. Treptat, odat\u0103 ce se obi\u0219nuiesc cu asta, oamenii \u00eencep s\u0103 \u00ee\u0219i optimizeze cererile \u0219i s\u0103 adauge indec\u0219i mai complexi care includ mai multe coloane. Astfel apar indec\u0219i pe coloanele <em>A<\/em>, <em>A+B<\/em>, <em>A+B+C<\/em> \u0219i a\u0219a mai departe. Primele dou\u0103 dintre ace\u0219ti indec\u0219i pot fi cu u\u0219urin\u021b\u0103 eliminate, deoarece sunt prefixe ale celui de-al treilea. Acest lucru economise\u0219te de asemenea un loc considerabil pe disc \u0219i pentru aceasta exist\u0103 diagnosticul <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\">Problema a patra - chei externe f\u0103r\u0103 indec\u0219i<\/h3>\n<p><\/p>\n<p>Postgres permite crearea de constr\u00e2ngeri de cheie extern\u0103 f\u0103r\u0103 indicarea unui index de suport. \u00cen multe situa\u021bii aceasta nu reprezint\u0103 o problem\u0103, \u0219i chiar poate s\u0103 nu se manifeste deloc... P\u00e2n\u0103 la un anumit moment...<\/p>\n<p><\/p>\n<p>A fost \u0219i la noi: pur \u0219i simplu, la un moment dat, jobul care se executa conform programului \u0219i cur\u0103\u021ba baza de date de comenzi de testare a \u00eenceput s\u0103 ne adune un master host. CPU \u0219i IO zburau \u00een aer, cererile \u00eent\u00e2rziau \u0219i se \u00eentrerupeau din cauza timeout-ului, serviciul returna erori 500. O analiz\u0103 rapid\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/monitoring-stats\">pg_stat_activity<\/a><\/noindex> a ar\u0103tat c\u0103 cererile de tip se blocau:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">\u015fterge din &lt;table&gt; unde id este &icirc;n (&hellip;)<\/code><\/pre>\n<p><\/p>\n<p>\u00cen acela\u0219i timp, indexul pe id \u00een tabelul \u021bint\u0103, evident, exista, iar \u00eenregistr\u0103rile erau \u0219terse pe baz\u0103 de condi\u021bie foarte pu\u021bin. P\u0103rea c\u0103 totul ar trebui s\u0103 func\u021bioneze, dar, din p\u0103cate, nu func\u021biona.<\/p>\n<p><\/p>\n<p>La ajutor a venit minunatul <strong>explain analyze<\/strong> \u0219i a spus c\u0103, pe l\u00e2ng\u0103 \u0219tergerea \u00eenregistr\u0103rilor din tabelul \u021bint\u0103, se face \u0219i verificarea integrit\u0103\u021bii referen\u021biale, \u0219i \u00een unul dintre tabelele asociate aceast\u0103 verificare degenereaz\u0103 \u00eentr-un <em>sequential scan<\/em> din cauza lipsei unui index adecvat. Astfel a ap\u0103rut diagnosticul <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\">Problema a cincea - valoarea null \u00een indec\u0219i<\/h3>\n<p><\/p>\n<p>Implicit, Postgres include valorile null \u00een indec\u0219ii btree, dar acestea nu sunt, de obicei, necesare acolo. De aceea, m\u0103 str\u0103duiesc cu s\u00e2rguin\u021b\u0103 s\u0103 elimin aceste null-uri (diagnosticul <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>), cre\u00e2nd indec\u0219i par\u021biali pe coloanele nullable de tip <code>where <A> is not null<\/code>. \u00cen acest mod, am reu\u0219it s\u0103 reduc dimensiunea unuia dintre indec\u0219ii no\u0219tri de la 1877 MB la 16 KB. \u00centr-unul dintre servicii, dimensiunea bazei de date a sc\u0103zut cu 16% (cu 4.3 GB \u00een cifre absolute) prin excluderea valorilor null din indici. O economie colosal\u0103 de spa\u021biu pe disc cu modific\u0103ri destul de simple. \ud83d\ude42 <\/p>\n<p><\/p>\n<h3 id=\"problema-shestaya--otsutstvie-pervichnyh-klyuchey\">Problema a \u0219asea \u2013 lipsa cheilor primare<\/h3>\n<p><\/p>\n<p>Datorit\u0103 particularit\u0103\u021bilor mecanismului <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/442804\/\">MVCC \u00een Postgres<\/a><\/noindex> poate ap\u0103rea o situa\u021bie \u00een care <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/169939\/\">bloat<\/a><\/noindex>, atunci c\u00e2nd dimensiunea tabelului dumneavoastr\u0103 cre\u0219te rapid din cauza unei cantit\u0103\u021bi mari de \u00eenregistr\u0103ri moarte. Am crezut naiv c\u0103 nu ne amenin\u021b\u0103 \u0219i c\u0103 baza noastr\u0103 nu va p\u0103\u021bi a\u0219a ceva, deoarece suntem, wow!!!, dezvoltatori normali\u2026 C\u00e2t de prost \u0219i naiv am fost\u2026<\/p>\n<p><\/p>\n<p>\u00centr-o zi frumoas\u0103, o migrare minunat\u0103 a luat \u0219i a actualizat toate \u00eenregistr\u0103rile dintr-un tabel mare \u0219i folosit activ. Am ob\u021binut +100 GB la dimensiunea tabelului f\u0103r\u0103 un motiv vizibil. A fost extrem de frustrant, dar neajunsurile noastre nu s-au oprit aici. Dup\u0103 ce avacuumul automat a durat 15 ore pe acest tabel, a devenit clar c\u0103 locul fizic nu se va \u00eentoarce. Nu am putut opri serviciul \u0219i realiza un VACUUM FULL, a\u0219a c\u0103 am decis s\u0103 folosim <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/noindex>. \u0218i aici s-a descoperit c\u0103 <em>pg_repack<\/em> nu poate procesa tabele f\u0103r\u0103 o cheie primar\u0103 sau cu alt\u0103 restric\u021bie de unicitate, iar tabelul nostru nu avea cheie primar\u0103. A\u0219a a ap\u0103rut diagnosticul <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>\u00cen versiunea bibliotecii <strong>0.1.5<\/strong> s-a ad\u0103ugat abilitatea de a colecta date despre bloat-ul tabelelor \u0219i indicilor \u0219i de a reac\u021biona la timp.<\/p>\n<p><\/p>\n<h3 id=\"problemy-sem-i-vosem--nehvatka-indeksov-i-neispolzuemye-indeksy\">Problemele \u0219apte \u0219i opt \u2013 lipsa indicilor \u0219i indec\u0219i neutiliza\u021bi<\/h3>\n<p><\/p>\n<p>Urm\u0103toarele dou\u0103 diagnostice \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> \u0219i <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 au ap\u0103rut \u00een forma lor final\u0103 relativ recent. Problema este c\u0103 nu puteau fi ad\u0103ugate pur \u0219i simplu.<\/p>\n<p><\/p>\n<p>A\u0219a cum am mai spus, folosim o configura\u021bie cu mai multe replici, iar \u00eenc\u0103rc\u0103tura de citire pe diferite gazde este fundamental diferit\u0103. Drept urmare, apare o situa\u021bie \u00een care anumite tabele \u0219i indici pe anumite gazde practic nu sunt utiliza\u021bi, \u0219i pentru analiz\u0103 trebuie s\u0103 colect\u0103m statistici de pe toate gazdele din 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\">Resetarea statisticilor<\/a><\/noindex> de asemenea, trebuie realizat\u0103 pe fiecare gazd\u0103 din cluster, nu se poate face doar pe master.<\/p>\n<p><\/p>\n<p>Aceast\u0103 abordare ne-a permis s\u0103 economisim c\u00e2teva zeci de gigabytes prin eliminarea indexurilor care nu au fost niciodat\u0103 utilizate \u0219i prin ad\u0103ugarea indexurilor lips\u0103 pe tabelele rareori folosite.<\/p>\n<p><\/p>\n<h3 id=\"v-kachestve-zaklyucheniya\">\u00cen concluzie<\/h3>\n<p><\/p>\n<p>Desigur, pentru aproape toate diagnostic\u0103rile se poate configura <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\">lista de excep\u021bii<\/a><\/noindex>. Astfel, este posibil s\u0103 implementa\u021bi rapid verific\u0103rile \u00een aplica\u021bia dumneavoastr\u0103, prevenind apari\u021bia unor noi erori \u0219i apoi corect\u00e2nd treptat erorile vechi.<\/p>\n<p><\/p>\n<p>O parte dintre diagnostic\u0103ri pot fi efectuate deja \u00een testele func\u021bionale imediat dup\u0103 aplicarea migra\u021biilor Bazei de Date. \u0218i aceasta este, f\u0103r\u0103 \u00eendoial\u0103, una dintre cele mai puternice capabilit\u0103\u021bi ale bibliotecii mele. Un exemplu de utilizare poate fi v\u0103zut \u00een <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\">demo<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Verific\u0103rile pentru indexuri neutilizate sau absente, precum \u0219i pentru bloat, au sens s\u0103 fie efectuate doar pe o Baz\u0103 de Date real\u0103. Valorile colectate pot fi \u00eenregistrate \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\">ClickHouse<\/a><\/noindex> sau trimise c\u0103tre un sistem de monitorizare.<\/p>\n<p><\/p>\n<p>Sper sincer c\u0103 <strong>pg-index-health<\/strong> va fi util\u0103 \u0219i solicitat\u0103. De asemenea, pute\u021bi contribui la dezvoltarea bibliotecii, raport\u00e2nd problemele descoperite \u0219i propun\u00e2nd noi diagnostic\u0103ri.<\/p>\n<p>Sursa: <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\/ro\/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=\"ro_RO\" \/>\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\/ro\/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\udd47Starea indexurilor \u00een PostgreSQL din perspectiva unui dezvoltator Java | ProHoster","description":"Salut. M\u0103 numesc Vania \u0219i sunt dezvoltator Java.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/72875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=72875"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/72875\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/72876"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=72875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=72875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=72875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}