Почему нет прямой (линейной) взаимосвязи между количеством обрабатываемых строк и затраченным временем?
Пример - я перемещаю строки из одной таблицы в другую. Если я перемещаю миллион строк, это занимает около 20 секунд, если я перемещаю 10 миллионов строк, то не занимает 200 секунд (около 4 минут), это приближается к 20 минутам, а если я перемещаю 20 миллионов строк это займет около 2 часов.
Справочная информация - я объединяю ежедневные разделы в более крупные ежемесячные разделы, выполняя следующие запросы как одну транзакцию .....
ALTER TABLE table_a DETACH PARTITION table_a_201811;
ALTER TABLE table_a DETACH PARTITION table_a_20181104;
WITH moved_rows AS
(
DELETE FROM table_a_20181104
RETURNING *
)
INSERT INTO table_a_201811
SELECT * FROM moved_rows;
ALTER TABLE table_a ATTACH PARTITION table_a_201811 FOR VALUES FROM ('2018-11-01') TO ('2018-11-05');
DROP TABLE table_a_20181104;
Эксперимент показывает, что команды ALTER TABLE для отсоединения / присоединения разделов занимают всего несколько секунд (по-видимому, независимо от размера таблицы), в то время как среднее утверждение, которое выполняет передача, занимает большую часть времени.
Я подумал, что если для перемещения миллионов строк потребуется x секунд, то для перемещения 2 миллионов строк потребуется 2x секунды, а для перемещения 10 миллионов строк - 10x секунд. Это не похоже на случай. Почему бы и нет? - а есть ли способ улучшить производительность?
Я использую версию 10.5, и процесс имеет эксклюзивный доступ к базе данных (никаких других соединений и блокировок, отображаемых в pg_locks, нет.