Różnica w czasie aktualizacji danych w tabeli.

0

Witam,
od pewnego czasu dodawanie danych oraz przeszukiwanie pewnej tabeli strasznie się wydłużyło. Dodam, że tabela z dokładnie tymi samymi danymi, postawiona na innym (słabszym) serwerze nie stwarza problemów. Przykładowy czas ładowania danych 1 godz 24 min vs 4 min. Pomyślałem, że problem leży w indeksach (trzeba je przebudować), jednak zanim to zrobię chciałbym mieć pewność, że właśnie indeksy stwarzają problem. Jak sprawdzić 'poprawność' działania indeksów?

0

Mogą być indeksy, mogą być statystki może być jakiś przepchany log. Może być problem z odczytem z dysku. Porównaj plany zapytań z obydwu instancji może to coś ci powie.
Wolny zapis występuje często przez dużą ilość indeksów na tabeli albo jakieś triggery.

0

Jak dodajesz dane ? Miałem nie dawno przedziwną historię z "parameters sniffing" w procedurze. Z dnia na dzień zamiast sekund zaczęła trwać minuty albo i dłużej. A tam też tylko czytanie danych, analiza i update do tabeli. Wygooglałem proste rozwiązanie - ale w sumie do tej pory nie kumam co tam się wydarzyło :|

1

Przyczyn może być mnóstwo ... kiedyś spotkałem się z sytuacją, że na środowisku testowym po prostu nie było dostępu do całej infrastruktury i np triggery, replikacja, tablice cieni, wysyłanie maila, generowanie raportów itd po prostu się na tym serwerze nie odpalały i działało szybko, a na produkcji zonk.

0

Dane dodawane są za pomocą procedury PL/SQL (najpierw analiza, potem wstawianie danych do tabeli). Dostęp na środowisku testowym jest praktycznie identyczny jak na środowisku produkcyjnym.
Dodam iż problem na pewno jest w tabeli, gdyż czasy działania innych programów, pobierających dane z tej tabeli również się wydłużyły. Sugerujecie odświeżenie statystyk?

1

Najpierw trzebaby zobaczyć co tam się dzieje. Odświeżenie staystyk nie powinno nic zepsuć. Nie wiadomo ile tez sie to bedzie przeliczyć.

0

@zohn: Czy masz możliwość analizy w locie (na działającym systemie) tego przypadku? Czy tylko dostajesz informację post-mortem (problem wystąpił i trwało to ~1h)?
Analiza na działającej sesji ładującej dane powinna dostarczyć odpowiedzi dlaczego jest powoli. Do tego celu możesz użyć oraclowego "wait interface".

https://oracle-base.com/dba/script?category=10g&file=session_waits.sql

Widok v$session dostarcza informacji n.t. wszystkich sesji. Ciebie będzie interesowała ta sesja, która realizuje ładowanie (można odfiltrować po username, osuser, program itd.)
Robiąc zrzuty w odstępach czasowych będziesz w stanie zauważyć na czym sesja czeka (locki, IO, cpu, itd.) i z tego wyciągnąć wnioski gdzie dalej szukać.

Jeśli dla takiej sesji zbierzesz dane np. z 5 minut działania w odstępach np. 15 sekundowych i podzielisz się tą informacją, to pewnie będę można powiedzieć coś o przyczynach i będzie oparte to na faktach, a nie domysłach.

0

Dziękuję za pomoc. Postanowiłem zacząć od zebrania statystyk (to jednak nic nie dało). Problemem okazał się indeks. Jego przebudowa sprawiła, że czas działania wrócił do normy. Nie rozumiem tylko dlaczego indeks przestał nagle działać prawidłowo. Czy usunięcie ok 100 rekordów z tabeli mającej ich kilka milionów mogło zakłócić jego działanie?

0

Hej

Właśnie usuwanie rekordów to spowodowało.. w dużych bazach danych nie stosuje sie usuwania wpisów a budowania indexów z flagami czy tez ze statusami.. Dodajesz kolumnę np Anulowane i gdy tam sie pojawi jakiś znak wszystkie indexy będą ignorować ten wpis..

1 użytkowników online, w tym zalogowanych: 0, gości: 1