Postgres - нелинейная связь между количеством строк и скоростью запроса - PullRequest
0 голосов
/ 07 ноября 2018

Почему нет прямой (линейной) взаимосвязи между количеством обрабатываемых строк и затраченным временем?

Пример - я перемещаю строки из одной таблицы в другую. Если я перемещаю миллион строк, это занимает около 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, нет.

...