Tùy thuộc vào có bao nhiêu bộ dữ liệu khác nhau, một tùy chọn sẽ là phân vùng các bảng cho mỗi tập dữ liệu.
Khi một tập dữ liệu được cập nhật, BEGIN
một giao dịch mới, TRUNCATE
bảng, COPY
dữ liệu mới vào đó và COMMIT
. PostgreSQL có một tối ưu hóa nơi COPY
ing vào một bảng đó là được TRUNCATE
d trong cùng một giao dịch không nhiều ít I / O nếu bạn đang sử dụng wal_level = minimal
(mặc định).
Nếu bạn không thể phân vùng và cắt bớt (giả sử, nếu bạn đang xử lý hàng chục hoặc hàng trăm nghìn bộ dữ liệu, nơi có quá nhiều bảng), thay vào đó, bạn sẽ muốn quay vòng tự động để chạy càng nhiều càng tốt , đảm bảo bạn có các chỉ mục tốt trên bất cứ thứ gì bạn xóa dựa trên và được chuẩn bị cho hiệu suất hơi bình thường.
Nếu bạn không cần sự cố an toàn - bạn không ngại các bảng của mình trống sau sự cố hệ thống - bạn cũng có thể tạo các bảng của mình UNLOGGED
, điều này sẽ giúp bạn tiết kiệm một khoản chi phí I / O rất lớn.
Nếu bạn không phải khôi phục toàn bộ thiết lập từ bản sao lưu sau sự cố hệ thống, bạn có thể tiến thêm một bước và cũng thiết lập fsync=off
, điều này về cơ bản nói với PostgreQuery "đừng bận tâm với sự cố an toàn, tôi có bản sao lưu tốt và tôi không 'quan tâm nếu dữ liệu của tôi là vĩnh viễn và hoàn toàn không thể phục hồi sau sự cố và tôi rất vui initdb
khi được sử dụng lại cơ sở dữ liệu của mình ".
Tôi đã viết thêm về điều này trong một chủ đề tương tự trên Stack Overflow về việc tối ưu hóa PostgreSQL để thử nghiệm nhanh ; đề cập đến việc điều chỉnh hệ điều hành máy chủ, tách WAL trên một đĩa khác nếu bạn không sử dụng unlogged
bảng, điều chỉnh con trỏ, v.v.
Ngoài ra còn có một số thông tin trong tài liệu PG để tải dữ liệu nhanh và cài đặt không bền .