Як налагодити нерегулярний запит?


13

У мене є пакетний запит, який я щодня запускаю у своїй базі даних. Однак, схоже, він застряг у непрацюючому стані, і у мене виникають великі труднощі з налагодженням того, що відбувається.

Запит - це агрегація таблиці, яка одночасно вставляється, і, напевно, якимось чином стосується проблеми. (Сукупність даних за попередніми днями, тому вставки не повинні впливати на результати.)

Підказки

  1. Я запускаю це всередині сценарію python, використовуючи sqlalchemy. Однак я встановив рівень транзакції для автоматичного здійснення комісії, тому не думаю, що все відбувається в транзакції. З іншого боку, я не бачу звисання запиту, коли запускаю його вручну в терміналі sql.

  2. Запитуючи pg_stat_activity, запит спочатку надходить у базу даних як state='active'. Можливо, через 15 секунд стан змінюється на "непрацюючий", а також додатково xact_startвстановлюється значення NULL. Прапор очікування ніколи не встановлюється істинним.

  3. Перш ніж я розібрався в автокомісії рівня транзакцій для sqlalchemy, він замість цього висить у стані, 'idle in transaction'а не 'idle'. І, можливо, висить трохи рідше з моменту внесення цієї зміни?

Я відчуваю, що я не готовий копати глибше, ніж у мене на цьому. Будемо дуже вдячні за будь-які відгуки, навіть пояснення більше про різні стани та відповідні внутрішні постгреси, не даючи однозначної відповіді.


2
Якщо стан у режимі очікування та він НЕ очікує, запит завершений, але з'єднання з db не закрите. простою в транзакції також означає, що запит завершено, але COMMITдля завершення транзакції не було видано жодного запиту . Здається, що ваша проблема може бути деінде ..
Джоїші Бодіо,

Так, я думаю, ти маєш рацію. Проблема полягає в тому, як Python обробляє запит, а не проблема з базою даних.
Курт Шпіндлер

Відповіді:


6

Перше, що вам потрібно розділити тут, це слова запит , транзакція та з'єднання .

  1. Підказка: ваш запит виконується - він знаходиться в активному стані. Після цього запит закінчується, але з'єднання залишається в режимі очікування. Угоди немає (вона була здійснена), тому значення xact_startє нульовим. Тож вам доведеться перервати з'єднання після успішного запиту.

  2. Підказка: Перед тим, як автокомісія була в запиті, було залишено посеред транзакції, тому спочатку вам доведеться, commitа потім close connection.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.