Trong một số trường hợp, và sau khi tạo ra một khối lượng lớn update
, insert
hoặc delete
từ một cái bàn, tôi đã bắt đầu VACUUM FULL ANALYZE
để đảm bảo rằng DB không bị quá tải. Làm điều đó trong cơ sở dữ liệu sản xuất đã cho tôi khám phá ra rằng đây không phải là một ý tưởng hay, bởi vì tôi có thể chặn bảng trong một thời gian dài. Vì vậy, tôi đã hủy quá trình, có thể thử chỉ VACUUM
(không đầy đủ) hoặc để AUTOVACUUM
sau này làm bất cứ điều gì nó có thể làm.
Câu hỏi là: nếu tôi dừng VACUUM hoặc AUTOVACUUM "giữa chừng", tất cả quá trình xử lý đã bị mất chưa?
Chẳng hạn, nếu VACUUM
đã tìm thấy 1 M hàng chết và tôi dừng nó, liệu tất cả thông tin này có bị mất không? VACUUM có hoạt động theo cách giao dịch đầy đủ ("tất cả hoặc không có gì", giống như một số lượng rất lớn các quy trình PostgreQuery)?
Nếu VACUUM có thể bị gián đoạn một cách an toàn mà không làm mất tất cả công việc, có cách nào để làm cho vacuum
công việc tăng dần không? [Làm việc trong 100 ms, dừng lại, đợi 10 ms để cho phép không chặn phần còn lại của thế giới ... và cứ thế]. Tôi biết bạn có thể thực hiện một phần của việc này bằng cách điều chỉnh các tham số tự động, nhưng tôi đang suy nghĩ về khả năng kiểm soát điều này theo chương trình, để có thể thực hiện nó trong một số thời điểm nhất định / trong một số điều kiện nhất định.
LƯU Ý: Dừng / hủy / hủy quy trình có nghĩa trong bối cảnh này:
- Nếu sử dụng pgAdmin, nhấn nút "Hủy truy vấn".
- Nếu làm việc theo chương trình, hãy gọi pg_cattery_backend ().
Tôi cho rằng cả hai đều tương đương. Tôi chưa sử dụng bất kỳ lệnh kill shell / system-level nào.