{"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\/cs\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","title":{"rendered":"Algoritmy zdrav\u00ed index\u016f v PostgreSQL o\u010dima Java v\u00fdvoj\u00e1\u0159e","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj.<\/p>\n<p><\/p>\n<p>Jmenuji se Vanya a jsem Java v\u00fdvoj\u00e1\u0159. Tak se stalo, \u017ee hodn\u011b pracuji s PostgreSQL \u2013 zab\u00fdv\u00e1m se nastaven\u00edm datab\u00e1z\u00ed, optimalizac\u00ed struktury, v\u00fdkonem a o v\u00edkendech si trochu hraji na DBA.<\/p>\n<p><\/p>\n<p>V posledn\u00ed dob\u011b jsem uspo\u0159\u00e1dal n\u011bkolik datab\u00e1z\u00ed v na\u0161ich mikroservis\u00e1ch a napsal java knihovnu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\">pg-index-health<\/a><\/noindex>, kter\u00e1 tuto pr\u00e1ci usnad\u0148uje, \u0161et\u0159\u00ed m\u016fj \u010das a pom\u00e1h\u00e1 se vyhnout n\u011bkter\u00fdm typick\u00fdm chyb\u00e1m, kter\u00e9 d\u011blaj\u00ed v\u00fdvoj\u00e1\u0159i. O t\u00e9to knihovn\u011b bude dnes \u0159e\u010d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Algoritmy zdrav\u00ed index\u016f v PostgreSQL o\u010dima Java v\u00fdvoj\u00e1\u0159e\" src=\"\/wp-content\/uploads\/2020\/03\/e00bd48edf601f398bd7748754d48b80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"disclaimer\">Pozn\u00e1mka<\/h3>\n<p><\/p>\n<p>Hlavn\u00ed verze PostgreSQL, se kterou pracuji, je 10. V\u0161echny SQL dotazy, kter\u00e9 pou\u017e\u00edv\u00e1m, byly tak\u00e9 ov\u011b\u0159eny na 11. verzi. Minim\u00e1ln\u011b podporovan\u00e1 verze je 9.6.<\/p>\n<p><\/p>\n<h3 id=\"predystoriya\">Pozad\u00ed<\/h3>\n<p><\/p>\n<p>V\u0161echno to za\u010dalo p\u0159ed t\u00e9m\u011b\u0159 rokem podivnou situac\u00ed pro m\u011b: konkurentn\u00ed vytvo\u0159en\u00ed indexu na pr\u00e1zdn\u00e9m m\u00edst\u011b skon\u010dilo s chybou. Samotn\u00fd index, jak u\u017e to b\u00fdv\u00e1, z\u016fstal v datab\u00e1zi v neplatn\u00e9m stavu. Anal\u00fdza log\u016f uk\u00e1zala nedostatek <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/runtime-config-resource\">temp_file_limit<\/a><\/noindex>. A za\u010dalo to\u2026 Po podrobn\u011bj\u0161\u00edm zkoum\u00e1n\u00ed jsem objevil celou \u0159adu probl\u00e9m\u016f v konfiguraci datab\u00e1ze a, zalo\u017eiv si ruk\u00e1vy, s leskem v o\u010d\u00edch jsem se pustil do jejich oprav.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"problema-pervaya--defoltnaya-konfiguraciya\">Prvn\u00ed probl\u00e9m \u2013 v\u00fdchoz\u00ed konfigurace<\/h3>\n<p><\/p>\n<p>Mo\u017en\u00e1 u\u017e je metafora o Postgresu, kter\u00fd m\u016f\u017eete spustit na k\u00e1vovaru, dost unavuj\u00edc\u00ed, ale\u2026 v\u00fdchoz\u00ed konfigurace skute\u010dn\u011b vyvol\u00e1v\u00e1 \u0159adu ot\u00e1zek. Minim\u00e1ln\u011b bychom m\u011bli v\u011bnovat pozornost <strong>maintenance_work_mem<\/strong>, <strong>temp_file_limit<\/strong>, <strong>statement_timeout<\/strong> a <strong>lock_timeout<\/strong>.<\/p>\n<p><\/p>\n<p>V na\u0161em p\u0159\u00edpad\u011b <strong>maintenance_work_mem<\/strong> byla v\u00fdchoz\u00ed hodnota 64 MB, a <strong>temp_file_limit<\/strong> n\u011bco kolem 2 GB \u2013 prost\u011b n\u00e1m chyb\u011bla pam\u011b\u0165 pro vytvo\u0159en\u00ed indexu na velk\u00e9 tabulce.<\/p>\n<p><\/p>\n<p>Proto jsem <strong>pg-index-health<\/strong> shrom\u00e1\u017edil \u0159adu <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\">kl\u00ed\u010dov\u00fdch<\/a><\/noindex>, podle m\u00e9ho n\u00e1zoru, parametr\u016f, kter\u00e9 je t\u0159eba nastavit pro ka\u017edou datab\u00e1zi.<\/p>\n<p><\/p>\n<h3 id=\"problema-vtoraya--dubliruyuschiesya-indeksy\">Druh\u00fd probl\u00e9m \u2013 duplicitn\u00ed indexy<\/h3>\n<p><\/p>\n<p>Na\u0161e datab\u00e1ze b\u011b\u017e\u00ed na SSD disc\u00edch a pou\u017e\u00edv\u00e1me <em>HA<\/em>-konfiguraci s n\u011bkolika datov\u00fdmi centry, master hostem a <em>n<\/em>-n\u00edm mno\u017estv\u00edm replik. M\u00edsto na disku je pro n\u00e1s velmi cenn\u00fd zdroj; je to stejn\u011b d\u016fle\u017eit\u00e9 jako v\u00fdkon a spot\u0159eba CPU. Proto na jedn\u00e9 stran\u011b pot\u0159ebujeme indexy pro rychl\u00e9 \u010dten\u00ed, a na druh\u00e9 stran\u011b nechceme vid\u011bt v datab\u00e1zi nadbyte\u010dn\u00e9 indexy, kter\u00e9 zab\u00edraj\u00ed m\u00edsto a zpomaluj\u00ed aktualizaci dat.<\/p>\n<p><\/p>\n<p>A tak, pot\u00e9, co jsem obnovil v\u0161echny <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/invalid_indexes.sql\">neplatn\u00e9 indexy<\/a><\/noindex> a pod\u00edval jsem se na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=aaecM4wKdhY\">p\u0159edn\u00e1\u0161ky Olega Bartunova<\/a><\/noindex>, rozhodl jsem se prov\u00e9st \"velk\u00fd\" \u00faklid. Uk\u00e1zalo se, \u017ee v\u00fdvoj\u00e1\u0159i neradi \u010dtou dokumentaci k datab\u00e1z\u00edm. Opravu neradi. To vede ke vzniku dvou typick\u00fdch chyb \u2013 ru\u010dn\u011b vytvo\u0159en\u00fd index na prim\u00e1rn\u00ed kl\u00ed\u010d a podobn\u00fd \"ru\u010dn\u00ed\" index na unik\u00e1tn\u00ed sloupec. Spo\u010d\u00edv\u00e1 v tom, \u017ee nejsou pot\u0159eba \u2013 Postgres v\u0161e ud\u011bl\u00e1 s\u00e1m. Takov\u00e9 indexy lze bezpe\u010dn\u011b odstranit a pro to byla vytvo\u0159ena diagnostika <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\">T\u0159et\u00ed probl\u00e9m \u2013 p\u0159ekr\u00fdvaj\u00edc\u00ed se indexy<\/h3>\n<p><\/p>\n<p>V\u011bt\u0161ina za\u010d\u00ednaj\u00edc\u00edch v\u00fdvoj\u00e1\u0159\u016f vytv\u00e1\u0159\u00ed indexy na jeden sloupec. Postupn\u011b, jak si na to zvyknou, za\u010d\u00ednaj\u00ed optimalizovat sv\u00e9 dotazy a p\u0159id\u00e1vat slo\u017eit\u011bj\u0161\u00ed indexy, kter\u00e9 zahrnuj\u00ed v\u00edce sloupc\u016f. Tak vznikaj\u00ed indexy na sloupce <em>A<\/em>, <em>A+B<\/em>, <em>A+B+C<\/em> a tak d\u00e1le. Prvn\u00ed dva z t\u011bchto index\u016f lze bezpe\u010dn\u011b vyhodit, proto\u017ee jsou prefixy t\u0159et\u00edho. To tak\u00e9 slu\u0161n\u011b \u0161et\u0159\u00ed m\u00edsto na disku a pro to existuje diagnostika <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\">\u010ctvrt\u00fd probl\u00e9m \u2013 ciz\u00ed kl\u00ed\u010de bez index\u016f<\/h3>\n<p><\/p>\n<p>Postgres umo\u017e\u0148uje vytv\u00e1\u0159et omezen\u00ed ciz\u00edho kl\u00ed\u010de bez uveden\u00ed podp\u016frn\u00e9ho indexu. V mnoha situac\u00edch to nen\u00ed probl\u00e9m a nemus\u00ed se to nijak projevovat\u2026 A\u017e do ur\u010dit\u00e9 doby\u2026<\/p>\n<p><\/p>\n<p>To bylo i u n\u00e1s: v ur\u010dit\u00e9m okam\u017eiku job, kter\u00fd se vykon\u00e1val podle pl\u00e1nu a odstra\u0148oval testovac\u00ed objedn\u00e1vky, za\u010dal \"skl\u00e1dat\" n\u00e1m master host. CPU a IO \u0161ly do pekla, dotazy se zpomalovaly a p\u0159eru\u0161ovaly z d\u016fvodu \u010dasov\u00e9ho limitu, slu\u017eba vyhazovala p\u011btistovky. Rychl\u00e1 anal\u00fdza <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/monitoring-stats\">pg_stat_activity<\/a><\/noindex> uk\u00e1zala, \u017ee se zasek\u00e1valy dotazy typu:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">smazat z &lt;table&gt; kde id v (&hellip;)<\/code><\/pre>\n<p><\/p>\n<p>P\u0159itom index podle id v c\u00edlov\u00e9 tabulce samoz\u0159ejm\u011b existoval a z\u00e1znamy se odstra\u0148ovaly podle podm\u00ednky \u00fapln\u011b m\u00e1lo. Zd\u00e1lo se, \u017ee by to m\u011blo fungovat, ale bohu\u017eel nefungovalo.<\/p>\n<p><\/p>\n<p>Na pomoc p\u0159i\u0161lo kouzeln\u00e9 <strong>explain analyze<\/strong> a \u0159eklo, \u017ee krom\u011b odstra\u0148ov\u00e1n\u00ed z\u00e1znam\u016f v c\u00edlov\u00e9 tabulce prob\u00edh\u00e1 tak\u00e9 kontrola referen\u010dn\u00ed integrity, a na jedn\u00e9 z propojen\u00fdch tabulek tato kontrola spadla do <em>sekvencn\u00edho skenov\u00e1n\u00ed<\/em> kv\u016fli absenci vhodn\u00e9ho indexu. Tak vznikla diagnostika <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\">P\u00e1t\u00fd probl\u00e9m \u2013 null hodnoty v indexech<\/h3>\n<p><\/p>\n<p>V\u00fdchoz\u00edm nastaven\u00edm Postgres zahrnuje null hodnoty do btree index\u016f, ale obvykle tam nejsou pot\u0159eba. Proto se sna\u017e\u00edm tyto null hodnoty vyhazovat (diagnostika <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>), vytv\u00e1\u0159\u00edm \u010d\u00e1ste\u010dn\u00e9 indexy na nullable sloupce ve tvaru <code>where <A> is not null<\/code>. T\u00edmto zp\u016fsobem se mi poda\u0159ilo zmen\u0161it velikost jednoho z na\u0161ich index\u016f z 1877 MB na 16 KB. A v jednom ze slu\u017eeb se celkov\u00e1 velikost datab\u00e1ze sn\u00ed\u017eila o 16 % (o 4,3 GB v absolutn\u00edch \u010d\u00edslech) d\u00edky vylou\u010den\u00ed hodnot null z index\u016f. Obrovsk\u00e1 \u00faspora m\u00edsta na disku p\u0159i celkem jednoduch\u00fdch \u00faprav\u00e1ch. \ud83d\ude42 <\/p>\n<p><\/p>\n<h3 id=\"problema-shestaya--otsutstvie-pervichnyh-klyuchey\">\u0160est\u00fd probl\u00e9m \u2013 absence prim\u00e1rn\u00edch kl\u00ed\u010d\u016f<\/h3>\n<p><\/p>\n<p>Vzhledem k charakteristice mechanismu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/442804\/\">MVCC v Postgresu<\/a><\/noindex> m\u016f\u017ee nastat takov\u00e1 situace, kdy velikost va\u0161\u00ed tabulky rychle roste kv\u016fli velk\u00e9mu mno\u017estv\u00ed mrtv\u00fdch z\u00e1znam\u016f. Naivn\u011b jsem si myslel, \u017ee n\u00e1m se to nestane, a \u017ee s na\u0161\u00ed datab\u00e1z\u00ed se to nikdy nestane, v\u017edy\u0165 jsme, hrome!!!, norm\u00e1ln\u00ed v\u00fdvoj\u00e1\u0159i\u2026 Jak naivn\u00ed jsem byl\u2026 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/169939\/\">bloat<\/a><\/noindex>Jednoho kr\u00e1sn\u00e9ho dne jedna \u00fa\u017easn\u00e1 migrace vzala a aktualizovala v\u0161echny z\u00e1znamy ve velk\u00e9 a aktivn\u011b vyu\u017e\u00edvan\u00e9 tabulce. Na velikosti tabulky jsme z\u00edskali +100 GB doslova zahodile. Bylo to neskute\u010dn\u011b frustruj\u00edc\u00ed, ale na\u0161e \u00fatrapy t\u00edmto neskon\u010dily. Pot\u00e9, co po 15 hodin\u00e1ch skon\u010dila automatick\u00e1 vakuace na t\u00e9to tabulce, bylo jasn\u00e9, \u017ee fyzick\u00e9 m\u00edsto se nevr\u00e1t\u00ed. Nemohli jsme zastavit slu\u017eby a prov\u00e9st VACUUM FULL, proto se rozhodlo pou\u017e\u00edt<\/p>\n<p><\/p>\n<p>. A tady se uk\u00e1zalo, \u017ee <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/noindex>neum\u00ed zpracov\u00e1vat tabulky bez prim\u00e1rn\u00edho kl\u00ed\u010de nebo jin\u00e9ho unik\u00e1tn\u00edho omezen\u00ed, a na na\u0161\u00ed tabulce \u017e\u00e1dn\u00fd prim\u00e1rn\u00ed kl\u00ed\u010d nebyl. Tak vznikla diagnostika <em>pg_repack<\/em> tables_without_primary_key <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/tables_without_primary_key.sql\">Ve verzi knihovny<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>byla p\u0159id\u00e1na mo\u017enost sb\u00edrat data o zneu\u017e\u00edv\u00e1n\u00ed tabulek a index\u016f a v\u010das na n\u011b reagovat. <strong>0.1.5<\/strong> Probl\u00e9my sedm a osm \u2013 nedostatek index\u016f a nevyu\u017e\u00edvan\u00e9 indexy<\/p>\n<p><\/p>\n<h3 id=\"problemy-sem-i-vosem--nehvatka-indeksov-i-neispolzuemye-indeksy\">N\u00e1sleduj\u00edc\u00ed dv\u011b diagnostiky \u2013<\/h3>\n<p><\/p>\n<p>tables_with_missing_indexes <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/tables_with_missing_indexes.sql\">unused_indexes<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/unused_indexes.sql\">\u2013 ve sv\u00e9m fin\u00e1ln\u00edm vyhotoven\u00ed se objevily relativn\u011b ned\u00e1vno. D\u016fvodem je, \u017ee je nebylo mo\u017en\u00e9 jen tak vz\u00edt a p\u0159idat.<\/a><\/noindex> Jak jsem ji\u017e psal, pou\u017e\u00edv\u00e1me konfiguraci s v\u00edce replikami a z\u00e1t\u011b\u017e \u010dten\u00ed na r\u016fzn\u00fdch hostitel\u00edch je principi\u00e1ln\u011b odli\u0161n\u00e1. V d\u016fsledku toho vznik\u00e1 situace, kdy n\u011bkter\u00e9 tabulky a indexy na n\u011bkter\u00fdch hostitel\u00edch prakticky nejsou vyu\u017e\u00edv\u00e1ny, a pro anal\u00fdzu je t\u0159eba sb\u00edrat statistiky ze v\u0161ech hostitel\u016f ve clusteru.<\/p>\n<p><\/p>\n<p>Resetovat statistiky <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\">je tak\u00e9 nutn\u00e9 na ka\u017ed\u00e9m hostiteli v clusteru, nen\u00ed mo\u017en\u00e9 to ud\u011blat pouze na hlavn\u00edm.<\/a><\/noindex> to tak\u00e9 pot\u0159ebn\u00e9 na ka\u017ed\u00e9m hostu v clusteru, nelze to ud\u011blat pouze na masteru.<\/p>\n<p><\/p>\n<p>Tento p\u0159\u00edstup n\u00e1m umo\u017enil u\u0161et\u0159it n\u011bkolik des\u00edtek gigabajt\u016f odstran\u011bn\u00edm index\u016f, kter\u00e9 nikdy nebyly pou\u017eity, a tak\u00e9 p\u0159idat chyb\u011bj\u00edc\u00ed indexy na m\u00e1lo pou\u017e\u00edvan\u00e9 tabulky.<\/p>\n<p><\/p>\n<h3 id=\"v-kachestve-zaklyucheniya\">Na z\u00e1v\u011br<\/h3>\n<p><\/p>\n<p>Samoz\u0159ejm\u011b, prakticky pro v\u0161echny diagnostiky lze nastavit <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\">seznam v\u00fdjimek<\/a><\/noindex>. Takto m\u016f\u017eete rychle implementovat kontroly ve va\u0161\u00ed aplikaci, p\u0159edej\u00edt vzniku nov\u00fdch chyb a n\u00e1sledn\u011b postupn\u011b opravovat star\u00e9.<\/p>\n<p><\/p>\n<p>N\u011bkter\u00e9 diagnostiky mohou b\u00fdt prov\u00e1d\u011bny ji\u017e ve funk\u010dn\u00edch testech ihned po nasazen\u00ed migrac\u00ed datab\u00e1ze. A to je pravd\u011bpodobn\u011b jedna z nejmocn\u011bj\u0161\u00edch funkc\u00ed m\u00e9 knihovny. P\u0159\u00edklad pou\u017eit\u00ed si m\u016f\u017eete prohl\u00e9dnout v <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>Kontroly nevyu\u017e\u00edvan\u00fdch nebo chyb\u011bj\u00edc\u00edch index\u016f, stejn\u011b jako na bloat, maj\u00ed smysl prov\u00e1d\u011bt pouze na re\u00e1ln\u00e9 datab\u00e1zi. Shrom\u00e1\u017ed\u011bn\u00e9 hodnoty mohou b\u00fdt zaznamen\u00e1ny do <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\">ClickHouse<\/a><\/noindex> nebo odesl\u00e1ny do monitorovac\u00edho syst\u00e9mu.<\/p>\n<p><\/p>\n<p>Opravdu douf\u00e1m, \u017ee <strong>pg-index-health<\/strong> bude u\u017eite\u010dn\u00e1 a \u017e\u00e1dan\u00e1. M\u016f\u017eete tak\u00e9 p\u0159isp\u011bt k rozvoji knihovny t\u00edm, \u017ee n\u00e1m ozn\u00e1m\u00edte nalezen\u00e9 probl\u00e9my a navrhnete nov\u00e9 diagnostiky.<\/p>\n<p>Zdroj: <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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\udd47Zdrav\u00ed index\u016f v PostgreSQL o\u010dima Java v\u00fdvoj\u00e1\u0159e | ProHoster","description":"Ahoj. Jmenuji se Vanya a jsem Java v\u00fdvoj\u00e1\u0159.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/72875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=72875"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/72875\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/72876"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=72875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=72875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=72875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}