PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Truy vấn cập nhật đơn giản chậm trên cơ sở dữ liệu PostgreSQL với 3 triệu hàng

Tôi phải cập nhật các bảng gồm 1 hoặc 2 tỷ hàng với nhiều giá trị khác nhau cho mỗi hàng. Mỗi lần chạy tạo ra ~ 100 triệu thay đổi (10%). Thử đầu tiên của tôi là nhóm chúng trong giao dịch 300 nghìn bản cập nhật trực tiếp trên một phân vùng cụ thể vì Postgresql không phải lúc nào cũng tối ưu hóa các truy vấn đã chuẩn bị nếu bạn sử dụng phân vùng.

  1. Các giao dịch của nhóm "UPDATE myTable SET myField =value WHEREmyId =id"
    Mang lại 1.500 cập nhật / giây. nghĩa là mỗi lần chạy sẽ mất ít nhất 18 giờ.
  2. Giải pháp cập nhật HOT như được mô tả ở đây với FILLFACTOR =50. Cung cấp 1.600 cập nhật / giây. Tôi sử dụng SSD nên đây là một cải tiến tốn kém vì nó tăng gấp đôi kích thước bộ nhớ.
  3. Chèn vào một bảng tạm thời có giá trị được cập nhật và hợp nhất chúng sau khi CẬP NHẬT ... FROM Cung cấp cho 18.000 cập nhật / giây. nếu tôi tạo VACUUM cho mỗi phân vùng; 100.000 lên / s nếu không. Cooool.
    Đây là chuỗi hoạt động sau:
CREATE TEMP TABLE tempTable (id BIGINT NOT NULL, field(s) to be updated,
CONSTRAINT tempTable_pkey PRIMARY KEY (id));

Tích lũy một loạt các bản cập nhật trong bộ đệm tùy thuộc vào RAM khả dụng Khi nó được lấp đầy hoặc cần thay đổi bảng / phân vùng hoặc hoàn thành:

COPY tempTable FROM buffer;
UPDATE myTable a SET field(s)=value(s) FROM tempTable b WHERE a.id=b.id;
COMMIT;
TRUNCATE TABLE tempTable;
VACUUM FULL ANALYZE myTable;

Điều đó có nghĩa là một lần chạy hiện mất 1,5 giờ thay vì 18 giờ cho 100 triệu bản cập nhật, bao gồm chân không. Để tiết kiệm thời gian, không cần thiết phải tạo chân không ĐẦY ĐỦ ở cuối nhưng ngay cả hút chân không nhanh thường xuyên cũng hữu ích để kiểm soát ID giao dịch của bạn trên cơ sở dữ liệu và không nhận được autovacuum không mong muốn trong giờ cao điểm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trình tự PostgreSQL dựa trên một cột khác

  2. Cơ chế sao chép vật lý trong PostgreSQL

  3. Vòng lặp trên các bảng với PL / pgSQL trong Postgres 9.0+

  4. pgp Dự đoán - Phân tích dự đoán trong PostgreSQL

  5. Làm cách nào để gửi một số yêu cầu http từ hàm postgresql hoặc trình kích hoạt