Phương pháp dễ nhất để giải quyết vấn đề là truy vấn thời gian chi tiết từ PostgreSQL: EXPLAIN . Đối với điều này, bạn cần tìm tối thiểu một truy vấn duy nhất hoàn thành nhưng mất nhiều thời gian hơn dự kiến. Hãy nói rằng dòng này sẽ giống như
delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
Thay vì thực sự chạy lệnh đó, bạn có thể làm
begin;
explain (analyze,buffers,timing) delete from mydata where id='897b4dde-6a0d-4159-91e6-88e84519e6b6';
rollback;
Việc khôi phục cuối cùng cho phép chạy nó mà không thực sự sửa đổi cơ sở dữ liệu nhưng bạn vẫn có được thời gian chi tiết của những gì đã mất bao nhiêu. Sau khi chạy nó, bạn có thể thấy trong đầu ra một số kích hoạt gây ra sự chậm trễ lớn:
...
Trigger for constraint XYZ123: time=12311.292 calls=1
...
Thời gian tính timebằng ms (mili giây) nên việc kiểm tra phần tiếp giáp này mất khoảng 12,3 giây. Bạn cần thêm một cái mớiINDEX cột qua các cột cần thiết để kích hoạt này có thể được tính toán hiệu quả. Đối với tham chiếu khóa ngoài, cột tham chiếu đến bảng khác phải được lập chỉ mục (nghĩa là cột nguồn, không phải cột mục tiêu). PostgreSQL không tự động tạo các chỉ mục như vậy cho bạn và DELETElà truy vấn phổ biến duy nhất mà bạn thực sự cần chỉ mục đó. Do đó, bạn có thể đã tích lũy nhiều năm dữ liệu cho đến khi bạn gặp trường hợp DELETEquá chậm do thiếu chỉ mục.
Khi bạn đã cố định hiệu suất của ràng buộc đó (hoặc một số thứ khác mất quá nhiều thời gian), hãy lặp lại lệnh trong begin / rollbackblock để bạn có thể so sánh thời gian thực hiện mới với trước đó. Tiếp tục cho đến khi bạn hài lòng với thời gian phản hồi xóa một dòng (Tôi có một truy vấn để đi từ 25,6 giây đến 15 ms chỉ bằng cách thêm các chỉ mục khác nhau). Sau đó, bạn có thể tiến hành hoàn thành xóa hoàn toàn mà không cần hack.
(Lưu ý rằng EXPLAINcần một truy vấn có thể hoàn thành thành công. Tôi đã từng gặp sự cố khi PostgreQuery mất quá nhiều thời gian để nhận ra rằng một lần xóa sẽ vi phạm ràng buộc khóa ngoại và trong trường hợp đó EXPLAINkhông thể sử dụng được vì nó sẽ không phát ra thời gian cho thất bại truy vấn. Tôi không biết cách dễ dàng để gỡ lỗi các vấn đề về hiệu năng trong trường hợp như vậy.)