Bagaimana cara men-debug Kueri Menganggur?

13

Saya memiliki permintaan batch yang saya jalankan setiap hari di database saya. Namun, tampaknya macet dalam keadaan siaga, dan saya mengalami banyak kesulitan men-debug apa yang terjadi.

Kueri adalah agregasi pada tabel yang secara bersamaan dimasukkan, yang saya duga terkait dengan masalah tersebut. (Agregasi adalah pada data hari-hari sebelumnya, sehingga penyisipan tidak akan memengaruhi hasil.)

Petunjuk

  1. Saya menjalankan ini di dalam skrip python menggunakan sqlalchemy. Namun, saya telah mengatur tingkat transaksi ke autocommit, jadi saya tidak berpikir ada sesuatu yang dibungkus dalam suatu transaksi. Di sisi lain, saya tidak melihat permintaan hang ketika saya menjalankannya secara manual di terminal sql.

  2. Dengan permintaan pg_stat_activity, permintaan awalnya masuk ke dalam database sebagai state='active'. Setelah 15 detik, status berubah menjadi 'idle' dan selain itu, xact_startdiatur ke NULL. Bendera yang menunggu tidak pernah disetel ke true.

  3. Sebelum saya menemukan autocommit tingkat transaksi untuk sqlalchemy, ia lebih baik menggantung dalam keadaan 'idle in transaction'daripada 'idle'. Dan itu mungkin sedikit lebih jarang hang sejak membuat perubahan itu?

Saya merasa tidak siap menggali lebih dalam dari ini. Setiap umpan balik, bahkan menjelaskan lebih lanjut tentang negara bagian yang berbeda dan internal postgres yang relevan tanpa memberikan jawaban yang pasti, akan sangat dihargai.

Kurt Spindler
sumber
2
Jika keadaan idle dan TIDAK menunggu, maka permintaan sudah selesai tetapi koneksi ke db tidak ditutup. idle dalam transaksi, juga, berarti bahwa permintaan sudah selesai tetapi belum ada yang COMMITdikeluarkan untuk mengakhiri transaksi. Sepertinya masalah Anda mungkin berada di tempat lain selain db ..
Joishi Bodio
Ya, saya pikir Anda benar. Masalahnya adalah bagaimana Python menangani kueri, bukan masalah dengan database.
Kurt Spindler

Jawaban:

6

Hal pertama yang harus Anda pisahkan di sini adalah kata query , transaksi , dan koneksi .

  1. Petunjuk: permintaan Anda dieksekusi - itu dalam keadaan aktif. Setelah itu permintaan berakhir tetapi koneksi tetap aktif - status siaga. Tidak ada transaksi (telah dilakukan) sehingga xact_startnol. Jadi, Anda harus menutup koneksi setelah kueri berhasil.

  2. Petunjuk: Sebelum autocommit berada, kueri ditinggalkan di tengah-tengah transaksi, jadi pertama-tama Anda harus melakukannya commitdan kemudian close connection.

Simo Kivistö
sumber