유휴 쿼리를 어떻게 디버깅합니까?


13

데이터베이스에서 매일 실행되는 배치 쿼리가 있습니다. 그러나 유휴 상태에 빠진 것처럼 보이며 진행 상황을 디버깅하는 데 많은 어려움이 있습니다.

쿼리는 동시에 삽입되는 테이블에 대한 집계이므로 문제와 관련이 있다고 생각합니다. 집계는 이전 날짜 데이터에 있으므로 삽입이 결과에 영향을 미치지 않아야합니다.

단서

  1. sqlalchemy를 사용하여 파이썬 스크립트 내에서 이것을 실행하고 있습니다. 그러나 트랜잭션 수준을 자동 커밋으로 설정했기 때문에 트랜잭션 안에 물건이 포장되어 있다고 생각하지 않습니다. 반면에 SQL 터미널에서 수동으로 쿼리를 실행할 때 쿼리가 중단되는 것을 볼 수 없습니다.

  2. 쿼리 pg_stat_activity를하면 쿼리는 처음에 데이터베이스로 들어옵니다 state='active'. 15 초 후에 상태가 '유휴'로 변경되고 또한가로 xact_start설정됩니다 NULL. 대기 플래그는 true로 설정되지 않습니다.

  3. 내가 SQLAlchemy의에 대한 트랜잭션 수준의 자동 커밋을 파악하기 전에, 대신 상태에 걸어 것 'idle in transaction'보다는 'idle'. 그리고 그 변경을 한 후 약간 덜 매달릴 가능성이 있습니까?

나는 내가 가지고있는 것보다 더 깊이 파낼 준비가되어 있지 않은 것처럼 느낍니다. 명확한 답변을 제공하지 않고 다른 주 및 관련 postgres 내부에 대해 더 설명하는 모든 의견은 크게 감사하겠습니다.


2
상태가 유휴 상태이고 대기 중이 아닌 경우 쿼리는 완료되지만 db에 대한 연결은 닫히지 않습니다. 또한 트랜잭션에서 유휴 상태 인 경우 쿼리가 완료되었지만 COMMIT트랜잭션 종료를 위해 발행 된 것이 없음을 의미 합니다. 문제는 다른 곳에 dB보다 수 것처럼 .. 소리
Joishi 보디 오에게

예, 당신 말이 맞아요 문제는 파이썬이 데이터베이스 문제가 아니라 쿼리를 처리하는 방식에 있습니다.
커트 스핀들러

답변:


6

여기서 분리해야 할 것은 쿼리 , 트랜잭션연결 이라는 단어 입니다.

  1. 단서 : 쿼리가 실행됩니다. 쿼리가 활성 상태입니다. 그 후 쿼리는 종료되지만 연결은 그대로 유지됩니다 (유휴 상태). 커밋 된 트랜잭션이 없으므로 xact_startnull입니다. 따라서 쿼리가 성공한 후 연결을 닫아야합니다.

  2. 단서 : 자동 커밋 트랜잭션의 중간에 왼쪽 된 쿼리되기 전에 이렇게 먼저해야 commit하고 close connection.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.