Комментарии 9
.. Если не читать Best practices, мир полон сюрпризов...
Крутой разбор, видно, что человек реально копал вглубь, а не пересказал доку. Особенно про параллельную вставку и атомарность полезно тем, кто работает с большими объёмами. Возьму на заметку COPY и unnest
https://habr.com/ru/companies/gazprombank/articles/965634/
Еще одна статья на вставку
Спасибо за ссылку.
Если интересно, вышла вторая статья. Она +- про тоже самое что и тут, только больше информации по спрингу. https://habr.com/ru/companies/gazprombank/articles/1010784/
Какая структура payment_document ? Какие индексы у payment_document? Как отсортированы исходные данные и отсортированы ли? Ладно, можно предположить, что индекс на account_id, и исходные данные отсортированы по account_id. Тогда при вставке данные ложатся по-порядку в индексы. Если account_id в исходных данных не по-порядку, то сервер будет будет складывать записи в разных местах индекса, подгружая страницы из разных мест. При этом будет большая деградация и ваши батчи будут бесполезны. Знакомая проблема с guid-ами в качестве ключей.
Также, если индекс содержи даты, а в исходных данных даты как попало.
Короче, надо исхитриться, чтобы при вставке записи вставлялись в последнюю страницу в дереве, и перебалансировок дерева не было.
Интересно также, секционирована ли таблица и как данные ложатся по секциям.
Вызывает скепсис, что многопоточность может увеличить скорость, при том, что данные по разным потокам будут иметь разные ключи payment_document, из-за чего (теоретически) строки от разных потоков будут писаться в страницы индекса вперемешку, что приведет к частым перебалансировкам дерева индекса. Разве что распределить данные по разным секциям и сделать, чтобы каждый поток писал в свою секцию.
Если индексов в таблице много, имеет ли смысл отключить их на момент массовой вставки, а потом пересоздать? Было ли это в данной работе сделано?
Структуру проекта можно посмотреть на гитхабе, его также можно запустить и произвести замеры на вашем оборудовании. Ссылка есть в начале статьи. Если коротко, там имеются индексы, но логику в них можно не искать. В данном случае они существуют только для того, чтобы мешать вставкам, симулируя работу реальной системы. В качестве ИД используется последовательность в постгресе, uuidv4 не используется. По последнему пункту (удаление индексов перед вставкой) есть исследование, но оно в другой статье, ссылку на которую дал LeshaRB.
Ускоряем вставку данных в PostgreSQL