Witam wszystkich,
Ostatnio musiałem uruchomić proces, który:
a) wyszuka rekordy z tabeli (z jakimiś joinami)
zrobi coś z tymi danymi
c) zaktualizuje te rekordy w tabeli
No i chodziło to na jednym procesie ale całość była niewydajna. W związku z tym rozdzieliłem wszystko na wiele podprocesów i zauważyłem dziwną anomalię...
Wszystkich procesów uruchamiam np. 30 i wszystkie wykonują się dość szybko - czas to od 0.02 do maks 0.2 sekundy. Jednak w pewnym momencie dochodzi do dziwnej sytuacji, a mianowicie jedno zapytanie (wszystkie są takie same) się przywiesza i trwa około 107 sekund. 4 inne trwają po 28 sekund. I nagle zapytania te odpuszczają (zwracają 0 rekordów, co jest rzeczą normalną). Reszta zapytań wykonuje się dość szybko.
Czy spotkał się ktoś z taką sytuacją lub wie, co może być przyczyną takiego zachowania?
Deadlocki?
Czy w tym momencie baza rzuciłaby jakimś błędem? Bo ja żadnego wyjątku nie dostaję. Poza tym wyciągając selectem dane dodaję warunek, który eliminuje możliwość działania dwóch procesów na tym samym rekordzie.
To jest tabela InnoDB?
Zapytanie ma jakieś podselect?
Tak, InnoDB. I tak, ma jeden podselect.
Ten podselect w update i dotyczy samej tabeli co nadrzędny update?
Problemy są z samym selectem.
Leci coś w stylu:
select x, y, z from (subselect z wherem i limitem) as t1 join t2 join t3 join t4 where x = 'test'
update potem leci ok
A indeksy są pozakładane?
Tak, indeksy są pozakładane - dlatego pierwsze zapytanie wykonuje się nawet w 0.02 sekundy. Razem jest uruchamianych około 27 procesów, z czego 23 lecą dość szybko (po wykonaniu selecta zapytanie zwraca 0 rekordów), a 4 wiszą - 3 z nich po około 70-80 sekundach się wykonuje, a czwarte po około 1300 sekundach...
Pokaż wynik EXPLAIN SELECT ... jednego z tych wolnych zapytań.
Kiedy wykonujesz je "samodzielnie", to działa szybko?
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)