{"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\/pl\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","title":{"rendered":"Zdrowie indeks\u00f3w w PostgreSQL oczami programisty Java","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107.<\/p>\n<p><\/p>\n<p>Nazywam si\u0119 Wania i jestem programist\u0105 Java. Tak si\u0119 sk\u0142ada, \u017ce du\u017co pracuj\u0119 z PostgreSQL \u2013 zajmuj\u0119 si\u0119 konfiguracj\u0105 baz danych, optymalizacj\u0105 struktury, wydajno\u015bci\u0105 i troch\u0119 bawi\u0119 si\u0119 w DBA w weekendy.<\/p>\n<p><\/p>\n<p>Ostatnio uporz\u0105dkowa\u0142em kilka baz danych w naszych mikroserwisach i napisa\u0142em bibliotek\u0119 java <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\">pg-index-health<\/a><\/noindex>, kt\u00f3ra u\u0142atwia t\u0119 prac\u0119, oszcz\u0119dza m\u00f3j czas i pomaga unikn\u0105\u0107 niekt\u00f3rych typowych b\u0142\u0119d\u00f3w pope\u0142nianych przez programist\u00f3w. To o tej bibliotece dzisiaj b\u0119dzie mowa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Zdrowie indeks\u00f3w w PostgreSQL oczami programisty Java\" src=\"\/wp-content\/uploads\/2020\/03\/e00bd48edf601f398bd7748754d48b80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"disclaimer\">Zrzeczenie si\u0119 odpowiedzialno\u015bci<\/h3>\n<p><\/p>\n<p>G\u0142\u00f3wna wersja PostgreSQL, z kt\u00f3r\u0105 pracuj\u0119, to 10. Wszystkie moje zapytania SQL zosta\u0142y r\u00f3wnie\u017c sprawdzone na wersji 11. Minimalna obs\u0142ugiwana wersja to 9.6.<\/p>\n<p><\/p>\n<h3 id=\"predystoriya\">T\u0142o<\/h3>\n<p><\/p>\n<p>Wszystko zacz\u0119\u0142o si\u0119 niemal rok temu od dziwnej sytuacji dla mnie: konkurencyjne tworzenie indeksu znik\u0105d zako\u0144czy\u0142o si\u0119 b\u0142\u0119dem. Sam indeks, jak to cz\u0119sto bywa, pozosta\u0142 w bazie w stanie nieprawid\u0142owym. Analiza log\u00f3w pokaza\u0142a brak <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/runtime-config-resource\">temp_file_limit<\/a><\/noindex>. I zacz\u0119\u0142o si\u0119\u2026 Kopi\u0105c g\u0142\u0119biej, odkry\u0142em ca\u0142y szereg problem\u00f3w w konfiguracji bazy danych i, podwijaj\u0105c r\u0119kawy, z b\u0142yskiem w oczach zabra\u0142em si\u0119 do ich naprawiania.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3 id=\"problema-pervaya--defoltnaya-konfiguraciya\">Problem pierwszy \u2013 domy\u015blna konfiguracja<\/h3>\n<p><\/p>\n<p>Prawdopodobnie metafora o Postgresie, kt\u00f3ry mo\u017cna uruchomi\u0107 na ekspresie do kawy, ju\u017c wszystkich zd\u0105\u017cy\u0142a zm\u0119czy\u0107, ale\u2026 konfiguracja domy\u015blna rzeczywi\u015bcie budzi szereg pyta\u0144. Co najmniej warto zwr\u00f3ci\u0107 uwag\u0119 na <strong>maintenance_work_mem<\/strong>, <strong>temp_file_limit<\/strong>, <strong>statement_timeout<\/strong> i <strong>lock_timeout<\/strong>.<\/p>\n<p><\/p>\n<p>W naszym przypadku <strong>maintenance_work_mem<\/strong> domy\u015blnie wynosi\u0142a 64 MB, a <strong>temp_file_limit<\/strong> oko\u0142o 2 GB \u2013 brakowa\u0142o nam banalnie pami\u0119ci do stworzenia indeksu na du\u017cej tabeli.<\/p>\n<p><\/p>\n<p>Dlatego w <strong>pg-index-health<\/strong> zebra\u0142em szereg <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\">kluczowych<\/a><\/noindex>, moim zdaniem, parametr\u00f3w, kt\u00f3re warto skonfigurowa\u0107 dla ka\u017cdej bazy danych.<\/p>\n<p><\/p>\n<h3 id=\"problema-vtoraya--dubliruyuschiesya-indeksy\">Problem drugi \u2013 duplikuj\u0105ce si\u0119 indeksy<\/h3>\n<p><\/p>\n<p>Nasze bazy dzia\u0142aj\u0105 na dyskach SSD, a my u\u017cywamy <em>HA<\/em>-konfiguracji z wieloma centrami danych, hostem g\u0142\u00f3wnym i <em>n<\/em>-liczb\u0105 replik. Miejsce na dysku to dla nas bardzo cenny zas\u00f3b; jest tak samo wa\u017cne, jak wydajno\u015b\u0107 i zu\u017cycie CPU. Dlatego z jednej strony potrzebujemy indeks\u00f3w do szybkiego odczytu, a z drugiej strony nie chcemy widzie\u0107 w bazie zb\u0119dnych indeks\u00f3w, poniewa\u017c zajmuj\u0105 one miejsce i spowalniaj\u0105 aktualizacj\u0119 danych.<\/p>\n<p><\/p>\n<p>I tak, przywracaj\u0105c wszystkie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/mfvanek\/pg-index-health\/blob\/master\/src\/main\/resources\/sql\/invalid_indexes.sql\">nieprawid\u0142owe indeksy<\/a><\/noindex> i przygl\u0105daj\u0105c si\u0119 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=aaecM4wKdhY\">prezentacjom Olega Bartunowa<\/a><\/noindex>, postanowi\u0142em przeprowadzi\u0107 \"wielkie\" czyszczenie. Okaza\u0142o si\u0119, \u017ce programi\u015bci nie lubi\u0105 czyta\u0107 dokumentacji dotycz\u0105cej bazy danych. Bardzo jej nie lubi\u0105. Z tego powodu wyst\u0119puj\u0105 dwa typowe b\u0142\u0119dy \u2013 r\u0119cznie utworzony indeks na klucz g\u0142\u00f3wny oraz podobny \"r\u0119czny\" indeks na unikaln\u0105 kolumn\u0119. Chodzi o to, \u017ce s\u0105 one zb\u0119dne \u2013 Postgres sam wszystko za\u0142atwi. Takie indeksy mo\u017cna \u015bmia\u0142o usuwa\u0107, a w tym celu powsta\u0142a diagnostyka <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\">Problem trzeci \u2013 nak\u0142adaj\u0105ce si\u0119 indeksy<\/h3>\n<p><\/p>\n<p>Wi\u0119kszo\u015b\u0107 pocz\u0105tkuj\u0105cych programist\u00f3w tworzy indeksy na jedn\u0105 kolumn\u0119. Stopniowo, kiedy poznaj\u0105 ten temat lepiej, ludzie zaczynaj\u0105 optymalizowa\u0107 swoje zapytania i dodawa\u0107 bardziej z\u0142o\u017cone indeksy, kt\u00f3re obejmuj\u0105 kilka kolumn. Tak powstaj\u0105 indeksy na kolumny <em>A<\/em>, <em>A+B<\/em>, <em>A+B+C<\/em> i tym podobne. Pierwsze dwa z tych indeks\u00f3w mo\u017cna spokojnie wyrzuci\u0107, poniewa\u017c s\u0105 prefiksami trzeciego. To r\u00f3wnie\u017c znacz\u0105co oszcz\u0119dza miejsce na dysku i w tym celu istnieje diagnostyka <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\">Problem czwarty \u2013 klucze obce bez indeks\u00f3w<\/h3>\n<p><\/p>\n<p>Postgres pozwala tworzy\u0107 ograniczenia klucza obcego bez wskazywania wspieraj\u0105cego indeksu. W wielu sytuacjach nie stanowi to problemu i mo\u017ce nawet w og\u00f3le si\u0119 nie objawia\u0107\u2026 Do pewnego momentu\u2026<\/p>\n<p><\/p>\n<p>Tak by\u0142o i u nas: w pewnym momencie job\u2019a, kt\u00f3ra dzia\u0142a\u0142a wed\u0142ug harmonogramu i oczyszcza\u0142a baz\u0119 z testowych zam\u00f3wie\u0144, zacz\u0119\u0142a \"sk\u0142ada\u0107\" nam g\u0142\u00f3wny hosting. CPU i IO wzros\u0142y do najwy\u017cszych warto\u015bci, zapytania zacz\u0119\u0142y si\u0119 zacina\u0107 i przerywa\u0107 z powodu przekroczenia limitu czasu, serwis zwraca\u0142 b\u0142\u0105d 500. Szybka analiza <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/10\/monitoring-stats\">pg_stat_activity<\/a><\/noindex> pokaza\u0142a, \u017ce zawieszaj\u0105 si\u0119 zapytania typu:<\/p>\n<p><\/p>\n<pre><code class=\"sql\">usu\u0144 z &lt;table&gt; gdzie id w (&hellip;)<\/code><\/pre>\n<p><\/p>\n<p>Przy tym indeks po id w docelowej tabeli, naturalnie, istnia\u0142, a rekordy by\u0142y usuwane na podstawie warunk\u00f3w, kt\u00f3rych by\u0142o bardzo ma\u0142o. Wydawa\u0142o si\u0119, \u017ce wszystko powinno dzia\u0142a\u0107, ale niestety nie dzia\u0142a\u0142o.<\/p>\n<p><\/p>\n<p>Na pomoc przyszed\u0142 cudowny <strong>explain analyze<\/strong> i powiedzia\u0142, \u017ce opr\u00f3cz usuwania rekord\u00f3w w docelowej tabeli, odbywa si\u0119 tak\u017ce sprawdzanie integralno\u015bci referencyjnej i na jednej z powi\u0105zanych tabel to sprawdzenie spada w <em>sequential scan<\/em> z powodu braku odpowiedniego indeksu. Tak powsta\u0142a diagnostyka <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\">Problem pi\u0105ty \u2013 warto\u015b\u0107 null w indeksach<\/h3>\n<p><\/p>\n<p>Domy\u015blnie Postgres uwzgl\u0119dnia warto\u015bci null w indeksach btree, ale zazwyczaj nie s\u0105 one potrzebne. Dlatego staram si\u0119 usuwac te null\u2019e (diagnostyka <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>), tworz\u0105c cz\u0119\u015bciowe indeksy na kolumny nullable typu <code>where <A> is not null<\/code>W ten spos\u00f3b uda\u0142o mi si\u0119 zmniejszy\u0107 rozmiar jednego z naszych indeks\u00f3w z 1877 MB do 16 KB. A w jednym z us\u0142ug rozmiar bazy danych SUMARYCZNIE zmniejszy\u0142 si\u0119 o 16% (o 4,3 GB w liczbach bezwzgl\u0119dnych) dzi\u0119ki wykluczeniu warto\u015bci null z indeks\u00f3w. Ogromna oszcz\u0119dno\u015b\u0107 miejsca na dysku przy stosunkowo prostych poprawkach. \ud83d\ude42 <\/p>\n<p><\/p>\n<h3 id=\"problema-shestaya--otsutstvie-pervichnyh-klyuchey\">Problem sz\u00f3sty \u2013 brak kluczy g\u0142\u00f3wnych<\/h3>\n<p><\/p>\n<p>Ze wzgl\u0119du na specyfik\u0119 mechanizmu <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/442804\/\">MVCC w Postgresie<\/a><\/noindex> mo\u017cliwe jest wyst\u0105pienie takiej sytuacji, jak <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/169939\/\">bloat<\/a><\/noindex>, kiedy rozmiar twojej tabeli szybko ro\u015bnie z powodu du\u017cej ilo\u015bci martwych rekord\u00f3w. Naiwnie uwa\u017ca\u0142em, \u017ce nas to nie dotyczy, \u017ce z nasz\u0105 baz\u0105 nic takiego si\u0119 nie stanie, bo my, oho!!!, jeste\u015bmy normalnymi deweloperami\u2026 Jak\u017ce g\u0142upi i naiwny by\u0142em\u2026<\/p>\n<p><\/p>\n<p>Pewnego pi\u0119knego dnia jedna cudowna migracja wzi\u0119\u0142a i zaktualizowa\u0142a wszystkie rekordy w du\u017cej i aktywnie u\u017cywanej tabeli. Zyskali\u015bmy +100 GB do rozmiaru tabeli z niczego. By\u0142o to strasznie frustruj\u0105ce, ale nasze perypetie na tym si\u0119 nie sko\u0144czy\u0142y. Po tym, jak przez 15 godzin zako\u0144czy\u0142 si\u0119 automatyczny proces vacuum na tej tabeli, sta\u0142o si\u0119 jasne, \u017ce fizyczne miejsce nie wr\u00f3ci. Nie mogli\u015bmy zatrzyma\u0107 us\u0142ugi i wykona\u0107 VACUUM FULL, dlatego podj\u0119to decyzj\u0119 o u\u017cyciu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/reorg\/pg_repack\">pg_repack<\/a><\/noindex>. I wtedy okaza\u0142o si\u0119, \u017ce <em>pg_repack<\/em> nie potrafi obs\u0142ugiwa\u0107 tabel bez klucza g\u0142\u00f3wnego lub innego ograniczenia unikalnego, a w naszej tabeli klucza g\u0142\u00f3wnego nie by\u0142o. Tak powsta\u0142a diagnostyka <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>W wersji biblioteki <strong>0.1.5<\/strong> dodano mo\u017cliwo\u015b\u0107 zbierania danych dotycz\u0105cych bloatu tabel i indeks\u00f3w oraz odpowiedniego reagowania na nie.<\/p>\n<p><\/p>\n<h3 id=\"problemy-sem-i-vosem--nehvatka-indeksov-i-neispolzuemye-indeksy\">Problemy siedem i osiem \u2013 brak indeks\u00f3w i nieu\u017cywane indeksy<\/h3>\n<p><\/p>\n<p>Dwie nast\u0119pne diagnostyki \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> i <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 w swojej ostatecznej formie pojawi\u0142y si\u0119 stosunkowo niedawno. Problem w tym, \u017ce nie mo\u017cna ich by\u0142o po prostu doda\u0107.<\/p>\n<p><\/p>\n<p>Jak ju\u017c pisa\u0142em, u\u017cywamy konfiguracji z wieloma replikami, a obci\u0105\u017cenie czytania na r\u00f3\u017cnych hostach jest zasadniczo r\u00f3\u017cne. W efekcie uzyskuje si\u0119 sytuacj\u0119, \u017ce niekt\u00f3re tabele i indeksy na niekt\u00f3rych hostach s\u0105 prawie nieu\u017cywane, a do analizy trzeba zbiera\u0107 statystyki ze wszystkich host\u00f3w w klastrze. <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\">Resetowanie statystyk<\/a><\/noindex> te\u017c trzeba wykonywa\u0107 na ka\u017cdym ho\u015bcie w klastrze, nie mo\u017cna tego zrobi\u0107 tylko na masterze.<\/p>\n<p><\/p>\n<p>Takie podej\u015bcie pozwoli\u0142o nam zaoszcz\u0119dzi\u0107 kilka dziesi\u0105tek gigabajt\u00f3w dzi\u0119ki usuni\u0119ciu indeks\u00f3w, kt\u00f3re nigdy nie by\u0142y u\u017cywane, a tak\u017ce dodaniu brakuj\u0105cych indeks\u00f3w do rzadko u\u017cywanych tabel.<\/p>\n<p><\/p>\n<h3 id=\"v-kachestve-zaklyucheniya\">Na zako\u0144czenie<\/h3>\n<p><\/p>\n<p>Oczywi\u015bcie, dla prawie wszystkich diagnostyk mo\u017cna skonfigurowa\u0107 <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\">list\u0119 wyj\u0105tk\u00f3w<\/a><\/noindex>. Dzi\u0119ki temu mo\u017cna szybko wprowadzi\u0107 kontrole w swojej aplikacji, zapobiegaj\u0105c pojawieniu si\u0119 nowych b\u0142\u0119d\u00f3w, a nast\u0119pnie stopniowo naprawia\u0107 stare.<\/p>\n<p><\/p>\n<p>Cz\u0119\u015b\u0107 diagnostyk mo\u017ce by\u0107 wykonywana ju\u017c w testach funkcjonalnych zaraz po wgraniu migracji bazy danych. I to, moim zdaniem, jedna z najpot\u0119\u017cniejszych mo\u017cliwo\u015bci mojej biblioteki. Przyk\u0142ad u\u017cycia mo\u017cna zobaczy\u0107 w <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>Kontrole dotycz\u0105ce nieu\u017cywanych lub brakuj\u0105cych indeks\u00f3w, a tak\u017ce na bloat, maj\u0105 sens przeprowadza\u0107 tylko na rzeczywistej bazie danych. Zebrane warto\u015bci mog\u0105 by\u0107 zapisane w <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ClickHouse\/ClickHouse\">ClickHouse<\/a><\/noindex> lub wys\u0142ane do systemu monitorowania.<\/p>\n<p><\/p>\n<p>Mam nadziej\u0119, \u017ce <strong>pg-index-health<\/strong> b\u0119dzie przydatna i poszukiwana. Mo\u017cesz r\u00f3wnie\u017c przyczyni\u0107 si\u0119 do rozwoju biblioteki, zg\u0142aszaj\u0105c wykryte problemy i proponuj\u0105c nowe diagnostyki.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Stan indeks\u00f3w w PostgreSQL oczami programisty Java | ProHoster","description":"Cze\u015b\u0107. Nazywam si\u0119 Iwan i jestem programist\u0105 Java.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/zdorove-indeksov-v-postgresql-glazami-java-razrabotchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/72875","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=72875"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/72875\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/72876"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=72875"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=72875"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=72875"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}