В базе данных Postgres (9.4) у нас есть таблица с 35 миллионами строк.Данные быстро статичны, сначала они вставляются с помощью COPY, а затем вычисляются несколько полей.
Пример расчета:
UPDATE mytable
SET the_name = the_rank || '_' || the_number || '_' || the_name
WHERE the_partition=5;
the_partition может иметь 5 различных значений, поэтомуВычисления не выполняются для всей таблицы, но для обновления имени_ требуется 5 запросов.
При обновлении 500 000 => это занимает около 30 с. Когда 5 000 000 => это должно занять 300 с, т. е. 5 мин
Но для 15 000 000 он не закончился через много часов ...
Я подозреваю, что автоматический пылесос плохо работает, поэтому я попытался настроить его более агрессивно,ожидая, что это будет автовакуум после обновления 500 000 строк
ALTER TABLE mytable SET (autovacuum_vacuum_scale_factor = 0.00);
ALTER TABLE mytable SET (autovacuum_analyze_scale_factor = 0.00);
ALTER TABLE mytable SET (autovacuum_vacuum_threshold = 500000);
ALTER TABLE mytable SET (autovacuum_analyze_threshold = 500000);
ALTER TABLE mytable SET (autovacuum_vacuum_cost_limit = 10000);
Но, насколько я понимаю, когда я запускаю большое обновление в 15 000 000, это происходит в той же транзакции, поэтому авто вакуум не будетприменяется объявление 15 000 000 строк новостей будут храниться до завершения запроса (как postgresql делает копию обновленных строк)?Так как же сделать время вычислений линейным?