Làm cách nào để gỡ lỗi Truy vấn nhàn rỗi?


13

Tôi có một truy vấn hàng loạt mà tôi đang chạy hàng ngày trên cơ sở dữ liệu của mình. Tuy nhiên, nó dường như bị kẹt trong trạng thái nhàn rỗi và tôi gặp rất nhiều khó khăn trong việc gỡ lỗi những gì đang diễn ra.

Truy vấn là một tập hợp trên một bảng đồng thời được chèn, mà tôi đoán bằng cách nào đó liên quan đến vấn đề. (Tổng hợp trên dữ liệu của những ngày trước, do đó, phần chèn thêm không ảnh hưởng đến kết quả.)

Manh mối

  1. Tôi đang chạy cái này bên trong một tập lệnh python bằng sqlalchemy. Tuy nhiên, tôi đã đặt cấp độ giao dịch thành tự động, vì vậy tôi không nghĩ mọi thứ đang bị cuốn vào một giao dịch. Mặt khác, tôi không thấy truy vấn bị treo khi tôi chạy thủ công trong thiết bị đầu cuối sql.

  2. Bằng cách truy vấn pg_stat_activity, truy vấn ban đầu đi vào cơ sở dữ liệu như state='active'. Sau khoảng 15 giây, trạng thái sẽ thay đổi thành 'không hoạt động' và ngoài ra, trạng thái xact_startđược đặt thành NULL. Cờ chờ không bao giờ được đặt thành đúng.

  3. Trước khi tôi tìm ra autocommit cấp độ giao dịch cho sqlalchemy, thay vào đó nó sẽ treo ở trạng thái 'idle in transaction'chứ không phải 'idle'. Và nó có thể bị treo ít thường xuyên hơn kể từ khi thực hiện thay đổi đó?

Tôi cảm thấy như mình không được trang bị để đào sâu hơn những gì tôi có về điều này. Bất kỳ thông tin phản hồi, thậm chí giải thích thêm về các trạng thái khác nhau và nội bộ postgres có liên quan mà không đưa ra câu trả lời chắc chắn, sẽ được đánh giá rất cao.


2
Nếu trạng thái không hoạt động và KHÔNG chờ đợi, thì truy vấn hoàn tất nhưng kết nối với db không được đóng. nhàn rỗi trong giao dịch, cũng có nghĩa là truy vấn đã hoàn thành nhưng không COMMITcó câu hỏi nào được đưa ra để kết thúc giao dịch. Có vẻ như vấn đề của bạn có thể ở nơi khác ngoài db ..
Joishi Bodio

Ya, tôi nghĩ bạn đúng. Vấn đề là cách Python xử lý truy vấn, không phải là vấn đề với cơ sở dữ liệu.
Kurt Spindler

Câu trả lời:


6

Điều đầu tiên bạn phải tách ra ở đây là các từ truy vấn , giao dịchkết nối .

  1. Clue: truy vấn của bạn được thực thi - nó ở trạng thái hoạt động. Sau đó, truy vấn kết thúc nhưng kết nối vẫn bật - trạng thái không hoạt động. Không có giao dịch (nó đã được cam kết) vì vậy xact_startlà null. Vì vậy, bạn phải đóng kết nối sau khi truy vấn thành công.

  2. Clue: Trước khi autocommit xuất hiện, truy vấn được đặt ở giữa giao dịch, vì vậy trước tiên bạn sẽ phải commitvà sau đó close connection.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.