konto usunięte

Temat: PostreSQL - problem z indexami

Witam.

W uproszczeniu: Mam tabelę i 2 indeksy, jeden założony na id, drugi na id i status.

Z jakiejś przyczyny mój postgres zaczął korzystać z indeksu założonego na 2 kolumny, pomimo, że w where podaje mu warunek tylko na kolumnę id. Wydłuża to czas trwania zapytania prawie 3 krotnie.
Skasowanie indeksu założonego na id,status powoduje, że wszystko wraca do normy.

Czy ktoś z grupowiczów orientuje się co jest przyczyną takiego zachowania i co można z tym zrobić?

Pozdrawiam.
Daniel Podlejski

Daniel Podlejski DBA,
SysAdmin/DevOps,
backend developer

Temat: PostreSQL - problem z indexami

Planer ma nieprawdziwe informacje. Zacznij od zwiększenia statistics_target i wymuszenia analyze. Ustaw też effective_cache_size na wartość wynikającą z rozmiaru RAM na serwerze.
W dalszej kolejności może być przydatne ustawianie kosztów - http://www.postgresql.org/docs/current/static/runtime-... - nie musisz tych wartości ustawiać od razu w konfiguracji, możesz ustawić dla sesji i eksperymentować.

konto usunięte

Temat: PostreSQL - problem z indexami

statistics_target już miałem zwiększone do 1000, nie sądziłem, że tak szybko przestanie wystarczać i się rozjedzie. effective_cache mam ustawione. Kosztów póki co nie ruszałem.

Teraz zwiększyłem statistics_target na 5000 i zaczęło korzystać z prawidłowych indeksów - wielkie dzięki.

konto usunięte

Temat: PostreSQL - problem z indexami

Krzysztof Magosa:
statistics_target już miałem zwiększone do 1000, nie sądziłem, że tak szybko przestanie wystarczać i się rozjedzie. effective_cache mam ustawione. Kosztów póki co nie ruszałem.

Teraz zwiększyłem statistics_target na 5000 i zaczęło korzystać z prawidłowych indeksów - wielkie dzięki.

To nie tak. Aż tak duża wartość jest bez sensu.

Czy po ustawieniu tego parametru zmieniałeś statystyki przez vacuum analyze, albo chociaż samo analyze?

"effective_cache mam ustawione" super, zawsze masz to ustawione... a na jaką wartość?

Zabawa z konfigiem nie polega na ustawieniu parametru. Polega na ustawieniu wielu parametrów w zależności od bazy, przeznaczenia i sprzętu.

Stawiam na to, że jak teraz zmniejszysz ten koszt do 100, to dalej będzie dobrze :)

konto usunięte

Temat: PostreSQL - problem z indexami

Szymon G.:
Krzysztof Magosa:
statistics_target już miałem zwiększone do 1000, nie sądziłem, że tak szybko przestanie wystarczać i się rozjedzie. effective_cache mam ustawione. Kosztów póki co nie ruszałem.

Teraz zwiększyłem statistics_target na 5000 i zaczęło korzystać z prawidłowych indeksów - wielkie dzięki.

To nie tak. Aż tak duża wartość jest bez sensu.
Próbowałem co tysiąc, dopiero przy 3000 zaczęło funkcjonować tak jak tego chcę.
Nie znam dokładnej zależności jak to ustawiać, więc próbowałem stopniowo.
Baza narasta 100-500k rekordów na dobę (rekord 20-100 KB), więc wolałem dać z zapasem.

Czy po ustawieniu tego parametru zmieniałeś statystyki przez vacuum analyze, albo chociaż samo analyze?
Tak, leciało za każdym razem vacuum analyze.

"effective_cache mam ustawione" super, zawsze masz to ustawione... a na jaką wartość?
Zgodnie z manualem jaki znalazłem - 50% ramu - 4096MB.

Zabawa z konfigiem nie polega na ustawieniu parametru. Polega na ustawieniu wielu parametrów w zależności od bazy, przeznaczenia i sprzętu.
Owszem, ale na chwilę obecną działa poprawnie, a jeśli nadmiar w tym parametrze zje 1 czy 2 GB więcej na dysku - nie przeszkadza mi to, ważne, że efekt jest osiągnięty.
Stawiam na to, że jak teraz zmniejszysz ten koszt do 100, to dalej będzie dobrze :)
Nie wiem - być może, byłoby mi łatwiej to regulować gdyby manual lepiej wyjaśniał przeznaczenie tego parametru.

konto usunięte

Temat: PostreSQL - problem z indexami

Krzysztof Magosa:
Szymon G.:
Czy po ustawieniu tego parametru zmieniałeś statystyki przez vacuum analyze, albo chociaż samo analyze?
Tak, leciało za każdym razem vacuum analyze.

A uruchamiasz vacuum analyze codziennie?

We recommend that active production databases be vacuumed frequently (at least nightly), in order to remove expired rows.

ANALYZE
Updates statistics used by the planner to determine the most efficient way to execute a query.


http://www.postgresql.org/docs/7.4/static/sql-vacuum.html

konto usunięte

Temat: PostreSQL - problem z indexami

Tak, uruchamiam.
Pytanie tylko, czy raz na dobę to nie za rzadko przy takim przyroście.
Od wczoraj baza urosła z 10 do 40GB.

konto usunięte

Temat: PostreSQL - problem z indexami

Aktualnie baza wypluwa do logów informacje, że wartość checkpoints_segments jest zbyt niska.
Wartość jest ustawiona na 10.

Punkty kontrolne występują zbyt często (co 15 sekund). Rozważ zwiększenie parametru konfiguracyjnego "checkpoints_segments"

konto usunięte

Temat: PostreSQL - problem z indexami

Zwiększyłem checkpoints_segments na 16, przestało sypać warningami.

konto usunięte

Temat: PostreSQL - problem z indexami

Przy takich przyrostach - trzeba poczekać... Za jakiś czas sytuacja powinna się ustabilizować.

Co do checkpointów... W ten sposób baza oznacza, że dane zostały przeniesione z ramu na dysk, i są bezpieczne. To jest istotne na wypadek padu systemu. Im dalej checkpoint tym więcej trzeba odtwarzać z logów. Da wcześniejszych wersji PG, była to operacja mocno obciążająca system, teraz jest lżej. Baza i tak smaruje do logów, zawsze, pytanie tylko na ile dane w buforach systemowych zostały zrzucone na dysk. Czyli dalej nie ma co robić tego za często. Domyślną wartość 5 minut, można spokojnie podnieść do 10 minut. Tak samo bezpieczna wartość... O ile oczywiście np. jest miejsce na dysku. Podbicie ilości segmentów do 16 oznacza, że będzie max. 16 plików po 16MB każdy. Ten warning w logach domyślnie pojawia się, jeżeli baza robi checka częściej jak co 30 sekund. Uwzględniając przyrost bazy, pewnie teraz robi co 35 sekund... Ja bym podbił timeout i ilość segmentów tak, żeby razem wypadało, coś koło 10 minut - w szczycie.

Ja tam nie wiem, ale latanie na forum z każdym, kolejnym problemem, to słaby pomysł. Lepiej to komuś zlecić. Za dwa miesiące dych będzie tyle, że każdy ruch zajmie pół dnia. Lepiej jak ktoś poświęci dzień pracy dziś, a potem kolejny - co miesiąc. Niż zabawa zacznie się za te 2 miesiące do 2 tygodni pracy... W zasadzie za pół roku efekt będzie ten sam, no z dokładnością do budżetu. :)

Pytania pomocnicze:
Jaka to konkretnie wersja bazy danych?
Czy ruch jest taki sam przez całą dobę?
Jaki jest stosunek poszczególnych operacji - w czasie?
Jaka replikacja jest stosowana i jak zachowuje się przy takim obciążeniu?

konto usunięte

Temat: PostreSQL - problem z indexami

Krzysztof Magosa:
Tak, uruchamiam.
Pytanie tylko, czy raz na dobę to nie za rzadko przy takim przyroście.
Od wczoraj baza urosła z 10 do 40GB.

Ale skąd taki przyrost? 300% ?
Było coś importowane?
Jeśli tak, to vacuum analyze uruchamiaj także po imporcie.

konto usunięte

Temat: PostreSQL - problem z indexami

Michał Z.:
Ja tam nie wiem, ale latanie na forum z każdym, kolejnym problemem, to słaby pomysł. Lepiej to komuś zlecić. Za dwa miesiące dych będzie tyle, że każdy ruch zajmie pół dnia. Lepiej jak ktoś poświęci dzień pracy dziś, a potem kolejny - co miesiąc. Niż zabawa zacznie się za te 2 miesiące do 2 tygodni pracy... W zasadzie za pół roku efekt będzie ten sam, no z dokładnością do budżetu. :)
Nie latam na forum z każdym problemem. Powiem więcej - rzadko kiedy to robię.
Nie zamierzam nikomu tego zlecać, bo to w sumie moje jedyne zajęcie w firmie.
System nie przynosi żadnego dochodu w sam sobie, więc byłoby to nawet ekonomicznie niezasadne.
Pytania pomocnicze:
Jaka to konkretnie wersja bazy danych?
Postgres 8.4
Czy ruch jest taki sam przez całą dobę?
Mniej więcej, ale nic nie stoi na przeszkodzie by zrobić przerwę na konserwację.
Jaki jest stosunek poszczególnych operacji - w czasie?
Można przyjąć 30/30/30 - insert/update/select.
Jaka replikacja jest stosowana i jak zachowuje się przy takim obciążeniu?
Aktualnie nie ma replikacji i całość pracuje na 1 serwerze.

konto usunięte

Temat: PostreSQL - problem z indexami

Piotr L.:
Krzysztof Magosa:
Tak, uruchamiam.
Pytanie tylko, czy raz na dobę to nie za rzadko przy takim przyroście.
Od wczoraj baza urosła z 10 do 40GB.

Ale skąd taki przyrost? 300% ?
Było coś importowane?
Jeśli tak, to vacuum analyze uruchamiaj także po imporcie.
To system, który wyciąga rekordy z bazy, parsuje je, dociąga z zewnętrznych źródeł brakujące dane i wkłada do bazy oraz buduje relacje między nimi. Codziennie dostaje nowe dane do analizy - kilkanaście razy na dobę, po czym dociągnięte dane są kilka tysięcy razy większe objętościowo od pierwotnych.

konto usunięte

Temat: PostreSQL - problem z indexami

Problemowy okazał się zbyt częsty autovacuum, standardowe ustawienie co 50 updejtów zabijało bazę. Dysk cały czas mielił na 100% swojej wydajności (a nie jest to jakaś super hiper maszyna).

konto usunięte

Temat: PostreSQL - problem z indexami

Krzysztof Magosa:
Michał Z.:
Ja tam nie wiem, ale latanie na forum z każdym, kolejnym problemem, to słaby pomysł. Lepiej to komuś zlecić. Za dwa miesiące dych będzie tyle, że każdy ruch zajmie pół dnia. Lepiej jak ktoś poświęci dzień pracy dziś, a potem kolejny - co miesiąc. Niż zabawa zacznie się za te 2 miesiące do 2 tygodni pracy... W zasadzie za pół roku efekt będzie ten sam, no z dokładnością do budżetu. :)
Nie latam na forum z każdym problemem. Powiem więcej - rzadko kiedy to robię.
Nie zamierzam nikomu tego zlecać, bo to w sumie moje jedyne zajęcie w firmie.
System nie przynosi żadnego dochodu w sam sobie, więc byłoby to nawet ekonomicznie niezasadne.
Pytania pomocnicze:
Jaka to konkretnie wersja bazy danych?
Postgres 8.4

Zrób upgrade, różnica wydajnościowa między 8.4 i 9.0 potrafi być znaczna.
Zalecany upgrade najlepiej do 9.1.
Daniel Podlejski

Daniel Podlejski DBA,
SysAdmin/DevOps,
backend developer

Temat: PostreSQL - problem z indexami

Kolejne rzeczy:
- skoro masz takie przyrosty dzienne, pomyśl o partycjonowaniu
- skoro masz taki stosunek I/U/D jak podajesz, warto ustawić fillfactor mniejszy niż domyślne 100%Daniel Podlejski edytował(a) ten post dnia 22.05.12 o godzinie 18:10

konto usunięte

Temat: PostreSQL - problem z indexami

Krzysztof Magosa:
Problemowy okazał się zbyt częsty autovacuum, standardowe ustawienie co 50 updejtów zabijało bazę. Dysk cały czas mielił na 100% swojej wydajności (a nie jest to jakaś super hiper maszyna).

Co 50 update'ów? Na całej tabeli - to masakra.
Nawet commity robi się rzadziej...

konto usunięte

Temat: PostreSQL - problem z indexami

Szymon G.:
Zrób upgrade, różnica wydajnościowa między 8.4 i 9.0 potrafi być znaczna.
Zalecany upgrade najlepiej do 9.1.
Zrobiłem upgrade do 9.1, różnica jest kolosalna.
Baza na defaultowych ustawieniach działa lepiej niż na 8.4 po całym dniu kombinowania.
Update na 300k rekordów zajmuje 10 sekund, na 8.4 leciał prawie 8 godzin.
Dane przeniesione bez żadnych modyfikacji...

konto usunięte

Temat: PostreSQL - problem z indexami

Piotr L.:
Krzysztof Magosa:
Problemowy okazał się zbyt częsty autovacuum, standardowe ustawienie co 50 updejtów zabijało bazę. Dysk cały czas mielił na 100% swojej wydajności (a nie jest to jakaś super hiper maszyna).

Co 50 update'ów? Na całej tabeli - to masakra.
Nawet commity robi się rzadziej...
Takie było standardowe ustawienie w debianie...

konto usunięte

Temat: PostreSQL - problem z indexami

W uproszczeniu: Mam tabelę i 2 indeksy, jeden założony na id, drugi na id i status.

Dlaczego dwa razy indeksujesz te same dane (id) ?

Następna dyskusja:

Dziwny problem w funkcji T-...




Wyślij zaproszenie do