Sử dụng PG 9.1 trên Ubuntu 12.04.
Hiện tại chúng tôi mất tới 24 giờ để chạy một tập hợp lớn các câu lệnh CẬP NHẬT trên cơ sở dữ liệu, có dạng:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
(Chúng tôi chỉ ghi đè các trường của các đối tượng được xác định bởi ID.) Các giá trị đến từ nguồn dữ liệu ngoài (chưa có trong DB trong bảng).
Các bảng có rất nhiều chỉ số mỗi và không có ràng buộc khóa ngoại. Không có CAM KẾT được thực hiện cho đến cuối cùng.
Phải mất 2h để nhập a pg_dump
của toàn bộ DB. Điều này có vẻ như một đường cơ sở chúng ta nên nhắm mục tiêu hợp lý.
Thiếu việc tạo ra một chương trình tùy chỉnh bằng cách nào đó tái tạo lại một tập dữ liệu cho PostgreSQL để nhập lại, liệu chúng ta có thể làm gì để mang lại hiệu năng CẬP NHẬT hàng loạt gần hơn với việc nhập? (Đây là một khu vực mà chúng tôi tin rằng cây hợp nhất có cấu trúc log xử lý tốt, nhưng chúng tôi tự hỏi liệu có bất cứ điều gì chúng tôi có thể làm trong PostgreQuery không.)
Một vài ý tưởng:
- bỏ tất cả các chỉ số không ID và xây dựng lại sau đó?
- tăng checkpoint_segments, nhưng điều này có thực sự giúp duy trì thông lượng dài hạn không?
- sử dụng các kỹ thuật được đề cập ở đây ? (Tải dữ liệu mới dưới dạng bảng, sau đó "hợp nhất" dữ liệu cũ nơi không tìm thấy ID trong dữ liệu mới)
Về cơ bản có rất nhiều thứ để thử và chúng tôi không chắc những gì hiệu quả nhất hoặc nếu chúng tôi đang xem những thứ khác. Chúng tôi sẽ dành vài ngày tới để thử nghiệm, nhưng chúng tôi nghĩ rằng chúng tôi cũng sẽ hỏi ở đây.
Tôi có tải đồng thời trên bàn nhưng nó chỉ đọc.
explain analyze
việc sử dụng chỉ mục để tra cứu?