Мне нужно обновить таблицы из 1 или 2 миллиардов строк с различными значениями для каждой строки.Каждый прогон вносит ~ 100 миллионов изменений (10%).Моя первая попытка заключалась в том, чтобы сгруппировать их в транзакции по 300 тыс. Обновлений непосредственно в конкретном разделе, поскольку Postgresql не всегда оптимизирует подготовленные запросы, если вы используете разделы.myId = id "
Дает 1500 обновлений / сек.это означает, что каждый запуск займет не менее 18 часов.
ГОРЯЧИЕ обновления, как описано здесь, с FILLFACTOR = 50.Дает 1600 обновлений / сек.Я использую твердотельные накопители, поэтому это дорогостоящее улучшение, поскольку оно удваивает размер хранилища. Вставьте во временную таблицу обновленного значения и объедините их после с помощью UPDATE ... FROM Дает
18 000 обновлений / сек.,если я сделаю ВАКУУМ для каждого раздела;100000 up / s в противном случае.Cooool.
Вот последовательность операций:
CREATE TEMP TABLE tempTable (id BIGINT NOT NULL, field(s) to be updated,
CONSTRAINT tempTable_pkey PRIMARY KEY (id));
Накапливать кучу обновлений в буфере в зависимости от доступной оперативной памяти, когда она заполнена, или необходимо изменить таблицу /раздел или завершен:
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;
Это означает, что запуск теперь занимает 1,5 часа вместо 18 часов для 100 миллионов обновлений, включая вакуум.