Jak debugować bezczynne zapytanie?

13

Mam zapytanie wsadowe, które codziennie uruchamiam w mojej bazie danych. Wydaje się jednak, że utknął w stanie bezczynności i mam duże trudności z debugowaniem tego, co się dzieje.

Zapytanie to agregacja w tabeli, która jest jednocześnie wstawiana, co, jak sądzę, w jakiś sposób odnosi się do problemu. (Agregacja dotyczy danych z poprzednich dni, więc wstawki nie powinny wpływać na wyniki).

Wskazówki

  1. Używam tego w skrypcie Pythona za pomocą narzędzia sqlalchemy. Jednak ustawiłem poziom transakcji na automatyczne zatwierdzanie, więc nie sądzę, żeby coś się zapakowało w transakcję. Z drugiej strony nie widzę, aby zapytanie zawiesiło się, gdy uruchomię je ręcznie w terminalu sql.

  2. Przez zapytanie pg_stat_activityzapytanie początkowo trafia do bazy danych jako state='active'. Po około 15 sekundach stan zmienia się na „bezczynny” i dodatkowo xact_startustawiony jest na NULL. Flaga oczekiwania nigdy nie jest ustawiona na wartość true.

  3. Zanim zorientowali się trybu automatycznego poziomie transakcji dla SQLAlchemy, to zamiast spędzać czas w stanie 'idle in transaction'zamiast 'idle'. A może od czasu wprowadzenia tej zmiany zawiesza się nieco rzadziej?

Mam wrażenie, że nie jestem w stanie kopać głębiej niż na tym. Wszelkie informacje zwrotne, nawet wyjaśniające więcej o różnych stanach i istotnych elementach wewnętrznych postgresu, bez jednoznacznej odpowiedzi, byłyby bardzo mile widziane.

Kurt Spindler
źródło
2
Jeśli stan jest bezczynny i NIE czeka, zapytanie jest zakończone, ale połączenie z bazą danych nie jest zamknięte. Bezczynność w transakcji oznacza również, że zapytanie zostało zakończone, ale nie COMMITzostało wydane żadne polecenie zakończenia transakcji. Wygląda na to, że Twój problem może dotyczyć
czegoś
Tak, myślę, że masz rację. Problem polega na tym, jak Python obsługuje zapytanie, a nie problem z bazą danych.
Kurt Spindler,

Odpowiedzi:

6

Pierwszą rzeczą, którą musisz tutaj rozdzielić, są słowa zapytanie , transakcja i połączenie .

  1. Wskazówka: zapytanie zostanie wykonane - jest w stanie aktywnym. Następnie zapytanie kończy się, ale połączenie pozostaje włączone - stan bezczynności. Nie ma transakcji (została zatwierdzona), więc xact_startjest zerowa. Musisz więc zamknąć połączenie po pomyślnym zakończeniu zapytania.

  2. Wskazówka: przed włączeniem automatycznego zatwierdzania zapytanie zostało pozostawione w środku transakcji, więc najpierw musisz to zrobić, commita potem close connection.

Simo Kivistö
źródło