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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.