|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Есть таблица с парой индексов. В нее идет интенсивная вставка в среднем по 20 записей за раз (в ХП передается массив и потом Insert из select from unnset(array)). Если индексы убрать, то 2млн записей вставляются за 25сек (на рабочей машине, не сервер). С индексами - 40сек. Разница ощутимая, но индексы нужны. Вопрос. Как можно ускорить? Есть ли в Postgre IOT? (нашел только CLUSTER, но так понимаю, что в БД будет все равно два объекта индекс и таблица и в общем скорость вставки в CLUSTER-ed table получается такая же, как и в варианте таблица + индексы). Есть ли в Postgre хинты? (что-нибудь типа append) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 18:02 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Есть таблица с парой индексов. В нее идет интенсивная вставка в среднем по 20 записей за раз (в ХП передается массив и потом Insert из select from unnset(array)). Если индексы убрать, то 2млн записей вставляются за 25сек (на рабочей машине, не сервер). С индексами - 40сек. Разница ощутимая, но индексы нужны. Вопрос. Как можно ускорить? Есть ли в Postgre IOT? (нашел только CLUSTER, но так понимаю, что в БД будет все равно два объекта индекс и таблица и в общем скорость вставки в CLUSTER-ed table получается такая же, как и в варианте таблица + индексы). Есть ли в Postgre хинты? (что-нибудь типа append) Это нормальный overhead на работу с индексами. Ничего с этим сделать не получится. А вот как ускорить уже вопрос интереснее. Попробуйте замерять время вставки тех же 2М записей через COPY FROM FILE предназначеном для батч операций (без хранимок, insert и прочего). Тогда будет понянее предельная скорость достижимая на вашей конкретной рабочей машине и на конкретной настройке базы. После чего можно будет думать о параметрах железа, настройке базы и тд (там тоже легко 2-3 раза скорости выйграть можно). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.02.2020, 20:19 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Maxim Boguk , сравнил. Insert 2млн записей Наличие индексовInsert по 20 записей (сек)Insert по 200 записей (сек)Copy from fileС индексами552525Без индексов301817 В итоге получается, если программно вставлять не по 20, а по 200 записей, то получается чуть ли не быстрее чем copy from file (тк в программном варианте еще идет вставка в мастер-таблицу, генерация сиквенса и case-ы в каждом поле таблицы деталей, куда заливаем 2млн записей, а время то же самое). То есть сам механизм работает так же по скорости, если брать пакеты большего размера. Но засада в том, что вставлять надо все же по 20 записей, а чаще еще меньше - например по 10. Может есть возможность распараллелить? То есть разбить таблицу на патиции по хешу например или другие варианты и грузить параллельно. В постгре это шардинг называется? Можно ли при шардинге таблицу держать в одной БД, а ее патиции разнести на разные диски? Или шардинг это когда таблицу кладут в разные ноды кластера? При шардинге не поддерживаются глобальные уник индексы? Надеюсь, что просто не умею готовить, но пока грустно со скоростями. Попробую еще на машине с SSD. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 00:48 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Попробовал еще так 1. делаем копию таблицы с 2млн записей (кстати ctas - 7сек вот это нормальная скорость :) 2. truncate исх таблицы 3. insert select в исх таблицу с индексами 30сек, без индексов - те же 18сек ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 01:04 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Но засада в том, что вставлять надо все же по 20 записей, а чаще еще меньше - например по 10. по 10 записей 200000 раз надо вставить? лучше буферизуйте их тогда ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 01:31 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS, А если использовать такой вариант: создать копию таблицы без индексов, вставлять в нее данные, как только счетчик доходит допустим до 200, делать инсерт из нее в основную таблицу, truncate и сброс секвенса в 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 09:05 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Swa111 , суть как предложил Алексей, но так будет дольше (инсерт в таблицу без индексов уже время то же самое, потом еще + переливка в таблицу с индексами). Алексей Роза , да, хороший вариант по-моему. Но возникают другие моменты (особенно 3): 1. Сиквенс придется генерить на стороне приложения (это конечно решаемо, не вопрос) 2. Если приложение падает, то накрываются все данные в буфере, но по бизнесу этим можно пожертвовать. 3. Сейчас в процедуру передается массив целых чисел (ID-шников) и кучка параметров, на основе которых генерятся значения для других полей в таблице через case-ы в самом запросе. Если сначала буферизовать данные, для набора пакета большего объема, то придется передавать не просто массив целых чисел, а уже желательно массив записей, то есть объектов. Поэтому вопрос, есть ли возможность в Postgres передавать из Java CallableStatement набор объектов (так-то в CallableStatement есть метод setObject, это поищу что за зверь). Либо передавать массив строк с json, а в постгре json_to_recordset, но не охота парсить ибо тоже затраты времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 13:15 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS В итоге получается, если программно вставлять не по 20, а по 200 записей, то получается чуть ли не быстрее чем copy from file (тк в программном варианте еще идет вставка в мастер-таблицу, генерация сиквенса и case-ы в каждом поле таблицы деталей, куда заливаем 2млн записей, а время то же самое). То есть сам механизм работает так же по скорости, если брать пакеты большего размера. Но засада в том, что вставлять надо все же по 20 записей, а чаще еще меньше - например по 10. Тут я сильно подозреваю что вы в свое железо и настройки базы упираетесь. Что у вас стоит в synchronous_commit max_wal_size checkpoint_timeout shared_buffers возможно загрузка у вас в fsync данных на диск упирается (и тогда понятно почему большие батчи идут быстрее). ps: а зачем вам партиции и шардирование для паралельной загрузки то? пишите спокойно в таблицу в 10 потоков и будет вам быстрее (насколько - зависит от вашего оборудования). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 13:41 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Maxim Boguk , итак пишу через тредпул в 15 потоков, это конечно дает ощутимый прирост, но диск-то все равно один. Памяти на машине 8GB, параметры: synchronous_commit - on max_wal_size - 1GB checkpoint_timeout - 5min shared_buffers - 128MB ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 13:57 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Maxim Boguk , итак пишу через тредпул в 15 потоков, это конечно дает ощутимый прирост, но диск-то все равно один. Памяти на машине 8GB, параметры: synchronous_commit - on max_wal_size - 1GB checkpoint_timeout - 5min shared_buffers - 128MB Протестируйте с synchronous_commit =off max_wal_size=16GB checkpoint_timeout=60min shared_buffers=2GB только рестарт базы не забудьте сделать после изменений (скорее всего влиять будет первый и последний параметр в основном). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 14:07 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Maxim Boguk , попробовал. Да получается побыстрее. Немного нелинейная зависимость получается, но и зависимость от размера пакета сохраняется, то есть вариант с буферизацией на стороне приложения пока актуален. Да и изменение параметров возможно влечет другие риски в частности настораживает synchronous_commit =off. Вставка 2млн записей Наличие индексовПакетами по 20 записей (сек)Пакетами по 200 записей (сек)Без индексов2620 С индексами3630 При этом в варианте без индексов по 200 записей время загрузки стало сильно нестабильным и колеблется от 11 до 35 секунд. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 14:46 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Swa111 , суть как предложил Алексей, но так будет дольше (инсерт в таблицу без индексов уже время то же самое, потом еще + переливка в таблицу с индексами). Алексей Роза , да, хороший вариант по-моему. Но возникают другие моменты (особенно 3): 1. Сиквенс придется генерить на стороне приложения (это конечно решаемо, не вопрос) 2. Если приложение падает, то накрываются все данные в буфере, но по бизнесу этим можно пожертвовать. 3. Сейчас в процедуру передается массив целых чисел (ID-шников) и кучка параметров, на основе которых генерятся значения для других полей в таблице через case-ы в самом запросе. Если сначала буферизовать данные, для набора пакета большего объема, то придется передавать не просто массив целых чисел, а уже желательно массив записей, то есть объектов. Поэтому вопрос, есть ли возможность в Postgres передавать из Java CallableStatement набор объектов (так-то в CallableStatement есть метод setObject, это поищу что за зверь). Либо передавать массив строк с json, а в постгре json_to_recordset, но не охота парсить ибо тоже затраты времени. под буферизацией имеется ввиду складывание строк в файл под будущий COPY а когда их набралось 2 млн (ну или пачками по 50000 грузите хотя бы - от этого тоже скорость зависит), то разом их все загрузили в БД и никаких потерь нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 15:46 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Maxim Boguk , попробовал. Да получается побыстрее. Немного нелинейная зависимость получается, но и зависимость от размера пакета сохраняется, то есть вариант с буферизацией на стороне приложения пока актуален. Да и изменение параметров возможно влечет другие риски в частности настораживает synchronous_commit =off. Вставка 2млн записей Наличие индексовПакетами по 20 записей (сек)Пакетами по 200 записей (сек)Без индексов2620 С индексами3630 При этом в варианте без индексов по 200 записей время загрузки стало сильно нестабильным и колеблется от 11 до 35 секунд.\ значит у вас упирается все в скорость fsync на вашем диске... на механике вообще больше 200-300 коммитов в секунду делать не получается по честному... поэтому вот так и работает. Будут быстрые ssd - разница между synchronous_commit =off и on будет не такой ощутимой (ну или нормальный рейд с кешом и батарейкой исправной на механических дисках). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 15:51 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Алексей Роза , тоже так думал, но во-первых, буде не сильно быстрее (в файл же тоже надо записать), во-вторых, самое главное, к этим данным могут идти селекты, а из файла не поселектишь особо ), поэтому придется все равно на время пока данные не легли в БД держать их в памяти, то есть буфер на 200+- записей Maxim Boguk , ок, попробую на SSD еще. И еще все же интересно что там с шардингом ) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 16:20 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Хотя селектить данные, которые еще не легли в БД тоже негуд, т.к. юзер заселектил из буфера приложения, дальше приложение вдруг упало и после восстановления пользователь уже не увидит данные, которые он видел до падения ибо они не записались в базу из буфера. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 16:32 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Алексей Роза , тоже так думал, но во-первых, буде не сильно быстрее (в файл же тоже надо записать), во-вторых, самое главное, к этим данным могут идти селекты, а из файла не поселектишь особо ), поэтому придется все равно на время пока данные не легли в БД держать их в памяти, то есть буфер на 200+- записей Maxim Boguk , ок, попробую на SSD еще. И еще все же интересно что там с шардингом ) у вас на том оборудовании что есть упирается не в запись в датафайлы а в запись в wal лог (fsync точнее) а он один и пишется последовательно (судя по вашим результатам) и всегда на одно устройство так что от шардинга ему ни холодно не жалко зато есть польза от выноса wal лога на другое/отдельное физическое устройство. В общем это больше к администрированию базы а не к архитектуре приложения вопрос. >>Может есть возможность распараллелить? >>То есть разбить таблицу на патиции по хешу например или другие варианты и грузить параллельно. >>В постгре это шардинг называется? это именно партиционирование называется... шардинг - когда на много независимых серверов с базами данных раскидывается нагрузка только пользы от него тут вам будет мало (не там узкое место). Можно ли при шардинге таблицу держать в одной БД, а ее патиции разнести на разные диски? Да Или шардинг это когда таблицу кладут в разные ноды кластера? Да. При шардинге не поддерживаются глобальные уник индексы? В зависимости от версии... в старых версиях вообще нет... в новых "Unique constraints on partitioned tables must include all the partition key columns. This limitation exists because PostgreSQL can only enforce uniqueness in each partition individually." что по сути тоже нет )). ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 18:26 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Maxim Boguk , спасибо за пояснения. Попутно еще возник вопрос по деградации производительности с ростом объема. То есть. 2млн записей вставляются в среднем за 25сек (условно 80тыс. записей/сек) А 30млн записей - за 22.5 минуты (примерно 22тыс записей/сек) То есть с ростом объема скорость падает практически в 4 раза в данном случае, что довольно ощутимо. Как боремся с этим? И все-таки шардинг и патиционирование - разные вещи значит? То есть таблица может быть и патиционирована и шардирована одновременно. В общем надо еще курить документацию, хотя бы основы, то тут все немного по-другому похоже ) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2020, 19:36 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Maxim Boguk , спасибо за пояснения. Попутно еще возник вопрос по деградации производительности с ростом объема. То есть. 2млн записей вставляются в среднем за 25сек (условно 80тыс. записей/сек) А 30млн записей - за 22.5 минуты (примерно 22тыс записей/сек) То есть с ростом объема скорость падает практически в 4 раза в данном случае, что довольно ощутимо. Как боремся с этим? Скорее всего данные перестают помещаться в кеш OS и shared buffer базы и начинают с диска читаться - и борятся с этим более быстрыми дисками (в пределе intel optane) или наращиванием памяти на сервере. Ну и checkpoints начинаются которые уже нагруженный диск - совсем ушатывают. Вообще бессмысленно проводить тесты производительности не на том оборудовании на котором проект планируется к работе. И все-таки шардинг и патиционирование - разные вещи значит? То есть таблица может быть и патиционирована и шардирована одновременно. Да может быть и так... но только шардирование это уже задача приложения а не базы (т.е. штатных методов шардирования в postgresql нет это всегда что то самописное). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2020, 01:15 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Maxim Boguk, спасибо, теперь с шардингом еще понятнее, думал, это в коробке) Продолжаю эксперименты. Пока самый быстрый вариант это передача массива и select from unnest пакетами в районе 200 значений в массиве. Но ввиду обьединения многих вызовов по 10-20 записей в один через буфер на 200 записей, нужен многомерный массив или обьекты типа pojo(это не пробовал, не знаю есть ли это в постгре). Поэтому. Пробовал еще просто батч инсерты - unnest быстрее. Пробовал засунуть все 200 записей в json и потом select from json_to_recordset - unnest быстрее. Пробовал передавать в процедуру в каждый из параметров отдельный массив и массив индексов массива - мало того, что криво но unnest из одного массива все равно ощутимо быстрее. Можно было бы попробовать передавать массив строк с разделителями и потом их парсить, но думаю, это будет примерно как с json_torecordset. Есть другая мысль. Передаются только числа. То есть можно пофиксить формат, выделив для каждого параметра определенное кол-во байт. И тогда парсить можно будет быстрее, сразу задавая смещение. Поэтому вопрос есть ли в постгре возможность работы с бинарными данными? То есть передавать одномерный массив, элементы которого двоичные данные. Хотя потом их все равно придется приводить к тому же bigint например. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 11:29 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Попробовал просто массив строк с фиксированным форматом. По скорости так же как вставка пакетами по 20 строк. То есть медленне чем json_to_recordset. Но может криво написано с типами и преобразованием. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 15:26 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Сделал таблицу с со всеми чаровскими полями, убрал из функции преобразование типов в запросе - вставка 2млн записей без индексов - 13сек, с индексами - 1min. Какая-то огромная разница, будто индексы по строкам строятся сильно дольше, чем по числам. Вопрос с аналогичным тестом, но переложенным в бинарный формат пока актуален. Так же как и вариант передачи массива обьектов без сериализации и последующего парсинга) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 15:42 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Сделал таблицу с со всеми чаровскими полями, убрал из функции преобразование типов в запросе - вставка 2млн записей без индексов - 13сек, с индексами - 1min. Какая-то огромная разница, будто индексы по строкам строятся сильно дольше, чем по числам. Вопрос с аналогичным тестом, но переложенным в бинарный формат пока актуален. Так же как и вариант передачи массива обьектов без сериализации и последующего парсинга) >>будто индексы по строкам строятся сильно дольше, чем по числам. так и есть... разница до порядка (а в тяжелых случаях - и заметно больше)... сравнение utf8 с учетом локализации - штука ОЧЕНЬ дорогая (по сравнению с сравнением 2 int4 просто по значению). ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 18:16 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
utf8 это wide string в C/C++ от простого string в тестах regexp, например, в разы отличаются ну а цифра - это самое удобное/быстрое для компьютера (так то строки это тоже цифры = номер в таблице) и когда есть возможность, надо всегда юзать их ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 21:09 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Прошу пардона, на самом деле пара запусков была по минуте, позже пробовал еще раз - 35-40сек, то есть разница не такая большая с индексами по чарам. Ну и кому-то может пригодится товарищ тоже шуршал в этом направлении . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 22:17 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Ну и на простеньком SSD, core i5-8400 2.8, 4Gb: insert 2млн записей, текущий вариант (массив строк фикс формата) в несколько потоков. Без индексов пакетами по 20 записей - 12сек пакетами по 200 записей - 5сек С индексами пакетами по 20 записей - 24сек пакетами по 250 записей - 16сек То есть все в 2 раза быстрее, хоть и ожидал большего, но 125тыс.записей/сек с индексами в целом нормально. Ище бы сюда IOT, index skip scan (тогда хватило бы одного индекса), патишены с возможностью их разнесения по разным дискам и логи на отдельный диск, плюс передача массива объектов или массива бинарных данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2020, 23:38 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Ище бы сюда IOT Чем бы оно помогло? JDS index skip scan (тогда хватило бы одного индекса) Всё в ваших руках, объясните вручную , посоучаствуйте в реализации JDS патишены с возможностью их разнесения по разным дискам и логи на отдельный диск Давным-давно существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2020, 11:50 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Melkij , да, как оказалось IOT + индекс вместо двух индексов ничего не дает. Насчет "объясните вручную" там что-то интересное, но если количество уникальных значений будет большим, эти рекурсивные запросы будут висеть очень долго. До соучастия очень далеко ) Нашел еще PgBulkInsert . на SSD вставка 2млн записей одним пакетом без индексов - 3сек, с индексами пакетами по 200 записей - 11сек Вполне себе неплохо, попробую пока остановиться на этом варианте. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2020, 00:27 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
ТОлько что взял 150к строк в секунду при помощи Код: plaintext
в базе один btree-индекс по четырем полям. Все настройки по-умолчанию. 5 млн всасывается за 3.4 секунды. база установлена в виртуалку с 8-мью виртуальными ЦПУ 32 ГБ рамы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 21:36 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
cvv ТОлько что взял 150к строк в секунду при помощи Код: plaintext
в базе один btree-индекс по четырем полям. Все настройки по-умолчанию. 5 млн всасывается за 3.4 секунды. база установлена в виртуалку с 8-мью виртуальными ЦПУ 32 ГБ рамы. Это все в один поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2020, 21:47 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
cvv, а есть возможность выложить тесткейс, прогнать у себя? У меня правда на машине где ssd core i5 и 4гб. Но копи так понимаю из файла инсертит. Если бы можно было хотя бы из потока копи. У меня просто копи с инднксами работает все равно небыстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 13:14 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
cvv , и еще не понятно если 150к в секунду, то откуда 5млн, за 3.5сек? Или скорость выше, или не 5млн, а 0.5млн? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 13:30 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS cvv, а есть возможность выложить тесткейс, прогнать у себя? У меня правда на машине где ssd core i5 и 4гб. Но копи так понимаю из файла инсертит. Если бы можно было хотя бы из потока копи. У меня просто копи с инднксами работает все равно небыстро. copy может из stdout прекрасно вставлять штатным методом. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 13:38 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS cvv , и еще не понятно если 150к в секунду, то откуда 5млн, за 3.5сек? Или скорость выше, или не 5млн, а 0.5млн? Да, ты прав. Вот числа с моего ноута (i7-7820HQ CPU @ 2.90GHz, 32 GB, Samsung pro SSD): Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:26 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS cvv , и еще не понятно если 150к в секунду, то откуда 5млн, за 3.5сек? Или скорость выше, или не 5млн, а 0.5млн? А вот вчерашний сервер на виртуалке (Xeon(R) Gold 6254 CPU @ 3.10GHz, 32 ГБ, SSD, VMWARE): Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:43 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS cvv, а есть возможность выложить тесткейс, прогнать у себя? У меня правда на машине где ssd core i5 и 4гб. Ну теоретически возможно, если у тебя Ubuntu 16.04. JDS cvv, Но копи так понимаю из файла инсертит. Если бы можно было хотя бы из потока копи. Нет, я инсерчу не с диска а с сети. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:48 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS, Таблица и индекс создается запросом из комментов в конце этого файла: https://github.com/fandrej/glonassd/blob/master/pg.c А COPY выгдядит вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.03.2020, 14:50 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
cvv , да, интересный вариант по скорости и в целом круто. А так у меня через один коннект к БД - 2млн - 20сек, но таблица 5 полей. Если в пуле 15 коннектов, то 11сек, 30 коннектов - 9сек. Не уверен, что у меня получится переложить С на Java, но в PgBulkInsert-е есть CopyManager , который работает через copy stdin, но примеры тоже из файла и то не проверял, как сделать обертку, чтобы читать из памяти как из файла... возможно сразу писать в OutputStream нужную информацию типа как в файл, а в CopyManager.copyIn передавать ридер для этого потока. Да и что писать на вход навроде String.GetBytes().. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2020, 00:04 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Там же есть еще PgBinaryWriter , это уже ближе к искомому похоже, но как с ним работать пока не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2020, 00:55 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS переложить С Упомянули бы что речь вовсе о C COPY t FROM STDIN (FORMAT binary); и PQputCopyData Формат структуры упомянут здесь: Binary format ... |
|||
:
Нравится:
Не нравится:
|
|||
08.03.2020, 16:52 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
Так как пишут, дескать бинари формат может съезжать от версии постгрес, пока без него. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 22:24 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
JDS Так как пишут, дескать бинари формат может съезжать от версии постгрес, пока без него. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2020, 23:49 |
|
Оптимизация INSERT-ов
|
|||
---|---|---|---|
#18+
cvv Все бэкапы построены на этом бинари формате. Нет. pg_dump при общении с базой использует текстовый формат copy. https://github.com/postgres/postgres/blob/REL_11_STABLE/src/bin/pg_dump/pg_dump.c#L1766 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2020, 00:17 |
|
|
start [/forum/topic.php?all=1&fid=53&tid=1994775]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 170ms |
0 / 0 |