|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Добрый вечер! Ситуация в следующем. На проекте хибернейт - все сущности имеют статегию генерации первичного ключа Identity Хибернейт не умеет делать батч инсерт/апдейт с генераторами такого типа Было принято решение поменять генераторы на sequence собственно я создал пару тестовых таблиц их ddl Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
сущности Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
что я делаю далее генерирую 100 сущностей А ,и подставлю им по 500 сущностей B далее используя обычный hibernate метод saveAll () записываем все это в базу Код: java 1. 2. 3. 4. 5. 6. 7.
по итогу выполнения имею следующую статистику при sequnce Код: plsql 1. 2. 3. 4.
видно что согласно документации - идет булк инсерт и вроде все здорово кроме времени выполнения проверяю тот же самый список на вставку ,но меняю идентификаторы на Identity и не верю своим глазам Код: plsql 1. 2. 3. 4.
50500 екзекутов ,непонятно откуда взявшиеся 100 батчей и самое главное - время выполнения меньше на 30 секунд Подскажите кто в курсе что происходит вообще,почему булк инсерты не дали ни какого прироста производительности,а даже ухудишили ее ,хотя как мы видим должно было быть минимум в 50 раз быстрей ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2021, 22:02 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
O_79_O, Включаете полный лог базы до миллисекунд с запросами и их временем выполнения. Прогоняете ваш тест. Смотрите какие запросы выполнялись и как именно и сколько времени заняли и какие перерывы по времени были между запросами. Дальше думаете и задаёте вопросы если непонятно что то будет. В нормальной ситуации вставка 50500 строк в базу редко занимает больше 5-10 секунд даже без использования bulk copy (а можно и за менее чем 1 секунду сделать через bulk load). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2021, 22:34 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Maxim Boguk, провел тест на секвенсах изначально идут запросы в секвенс Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
их там достаточно много вот таких далее идет череда инсертов в таблицу А Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
потом инсерты в таблицу B Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
ну и под конец идет апдейт таблицы B где проставляется FK a_id Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
если я не ошибаюсь никаким булк инсертом тут и не пахнет - вопрос что тут не так ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 00:23 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
А должно быть что то на подобии вот такого запроса Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
очень странно все это ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 00:28 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
O_79_O, Ну это уже очевидно не вопрос к базе. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 00:37 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Maxim Boguk O_79_O, Ну это уже очевидно не вопрос к базе. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ну тоесть по логам видно что построчный инсерт идет? я просто не в курсе ,как булк инсерты логируются - может именно так ? Хотя кого я обманываю,по времени выполенения видно что идет построчная вставка обычная ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 10:10 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
O_79_O Maxim Boguk O_79_O, Ну это уже очевидно не вопрос к базе. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ну тоесть по логам видно что построчный инсерт идет? я просто не в курсе ,как булк инсерты логируются - может именно так ? Хотя кого я обманываю,по времени выполенения видно что идет построчная вставка обычная у вас ещё сами вставки какие то не быстрые совсем... я бы включил txid/vxid в лог и посмотрел у вас вообще это всё одной транзакцией идёт или нет... и если нет сделать чтобы была явная транзакция в начале и коммитв конце. Ну или syncronous_commit бы в базе отключил. Оба варианта дадут выйгрыш по скорости если делать как сейчас. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 10:31 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Maxim Boguk O_79_O пропущено... ну тоесть по логам видно что построчный инсерт идет? я просто не в курсе ,как булк инсерты логируются - может именно так ? Хотя кого я обманываю,по времени выполенения видно что идет построчная вставка обычная у вас ещё сами вставки какие то не быстрые совсем... я бы включил txid/vxid в лог и посмотрел у вас вообще это всё одной транзакцией идёт или нет... и если нет сделать чтобы была явная транзакция в начале и коммитв конце. Ну или syncronous_commit бы в базе отключил. Оба варианта дадут выйгрыш по скорости если делать как сейчас. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru сама вставка то быстрая,а вот биндинг параметров да - но это ожидаемо было самое главное как понять работает ли батчинг - в логах хибера пишет что исполнюятся батчи- а в логах базы я вижу построчные инсерты ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 12:47 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
1. Что Вы понимаете под словом "батч" в контексте Hibernate и PostgreSQL ? 2. Что Вы понимаете под словом "биндинг параметров" в контексте Hibernate и PostgreSQL ? пять раз прочитал фразу "сама вставка то быстрая,а вот биндинг параметров да - но это ожидаемо было" смысла предложения так и не понял. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 12:55 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, В контексте postgresql batch это COPY FROM STDIN а вот что там в контексте hibernate получается это я не знаю. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 13:15 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Maxim Boguk, Автор очень ленив. Ему сказано было - сделать батчинг не в хибере, а в jdbc без него. Если работает и ускоряет реально то пробовать прийти к этому скрипту средствами хибера. Но автор ленив и кода мы не дождались. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 14:38 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Из хелпа хибера: Хибер применяет пакетирование jdbc. Это значит он собирает команды чтобы драйвер отдал бд за ОДИН СЕТЕВОЙ вызов. Почему ТС сопли жует второй день непонятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 14:43 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
1. Нафига тесты. Документацию читать надо. Что понимается под понятием batch в конкретной СУБД и в конкретном драйвере. Случайно нашел в гугле ссылку на очень хорошее описание работы PostgreSQL JDBC драйвера. См. https://stackoverflow.com/questions/47664889/jdbc-batch-operations-understanding По данной ссылке, преобразование batch insert в многострочный Insert (подозреваю это и хочет в логах увидеть автор), появилось в JDBC 9.4.1209 (2016-07-15). Для включения этого режима, в строке соединения с базой данных нужно указать reWriteBatchedInserts=true 2. 50500 екзекутов ,непонятно откуда взявшиеся 100 батчей и самое главное - время выполнения меньше на 30 секунд Подскажите кто в курсе что происходит вообще,почему булк инсерты не дали ни какого прироста производительности,а даже ухудишили ее ,хотя как мы видим должно было быть минимум в 50 раз быстрей 2.1. а даже ухудишили ее Подозреваю, bulk insert тут не причем. Ухудшили сиквенсы. Т.к. добавилось еще 50500 запросов к сиквенсам. 2.2. почему булк инсерты А должны были? ))) 2.3. UPDATE в логе совершенно лишнии. Я бы сначала разобрался, из-за чего у Вас такие команды кривые (явно это кривость Вашего прикладного кода). Не будет UPDATE - будет минимум в 2-а раза быстрее, а нагрузка на базу (и физический диск) вообще станет меньше раза в 3 (три). AFAIK команда update в PostgreSQL почти эквивалентна delete + insert. Т.ч. insert + update, для postgresql почти то же самое, что и insert+delete+insert ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 14:52 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Это значит он собирает команды чтобы драйвер отдал бд за ОДИН СЕТЕВОЙ вызов. ерунда какая-то Ничего это не значит. Никто никакого "один сетевой вызов" не обещал. Разные СУБД и драйвера могут реализовывать данные ф-ции по разному. В том числе, вообще никак не реализовывать (если в протоколах или в СУБД нет возможности реализовать данный функционал). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 14:56 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Я дал текст из справки хибера. Он просто сверху обращается к jdbc. Согласен с тобой что это чисто фича хибера а не JPA. Они так сделали и наверно гордятся. Я бы не делал вообще того что автор задумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 15:32 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Собственно все разрешилось выставлением флага ?reWriteBatchedInserts=true в jdbc драйвере постгреса теперь как и ожидалсь скорость вставки 10 к элементов меньше в около 1000 мс,чего я собственно и ждал Всем спасибо за участие ,тему можно закрывать ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 17:30 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
O_79_O, Давно бы так. Идите юноша от низов. От БД, ее DDL и JDBC. А не от ОРМ, спринга и прочей нечисти фреймворков. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 18:41 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
единственный нюанс reWriteBatchedInserts=true работает только на вставку, есть ли такой же флаг на апдейет) ибо с апдейтом вот эта фича постгрес не работает и апдейт идет построчно ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2021, 21:13 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
O_79_O единственный нюанс reWriteBatchedInserts=true работает только на вставку, есть ли такой же флаг на апдейет) ибо с апдейтом вот эта фича постгрес не работает и апдейт идет построчно Напиши батчинг как его пишут без ОРМ и хибера на jdbc. Это вынесение коммита во вне цикла for. Потом это же сделайте уже в spring Data JPA. Искать флаг или галочку плохой тон для программиста. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 08:09 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Это вынесение коммита во вне цикла for. Потом это же сделайте уже в spring Data JPA. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 09:51 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
PetroNotC Sharp Напиши батчинг как его пишут без ОРМ и хибера на jdbc. Какое значение Вы вкладываете в слово "батчинг" ? В Oracle есть понятие "bulk", обработка массива записей одной командой. IMHO Именно для поддержки этой и похожей фитч СУБД в Java и добавили addBatch, executeBatch В других СУБД (в т.ч. и PostgreSQL) такой возможности может и не быть. Ряд JDBC драйверов пытаются подменить "правильный" bulk на какие-то другие фичи своих СУБД. Т.ч. проблема топикстартера - поиск черной кошки в темной комнате. IMHO Если нужна максимальная производительность - читать документацию по СУБД и использовать соответствующие возможности своей СУБД. Например, если в PostgreSQL нужна максимальная производительность по вставке - есть команда COPY (AFAIK разница с insert может быть до нескольких порядков, т.е. 10-100 раз) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 19:09 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Дык выше я писал несколько раз ключевую фразу. Вынести коммит за пределы цикла. Я еще надцать лет назад в дельфи писал цикл for 50 раз insert и 1 раз коммит. Самое смешное что JPA spring data тоже самое пишут. Сброс в бд пачки записей. Понятно объяснил или псевдо код дать? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 19:50 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, В отношении термина bulk вы правы. Все по разному. Вот тоже убыстрял запись в сиквел на дельфи надцать лет назад XML - оптимальный путь передачи данных ОДИН-ко-МНОГИМ? Ну по ТС вы тоже правы. Он просто ленив раз кода нет в топике до сих пор. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2021, 20:07 |
|
Posgres+hiber очень медленная вставка
|
|||
---|---|---|---|
#18+
Но как же так? Хибернейт это же лучший ОРМ! Вот ты и поел дерьма. O_79_O теперь как и ожидалсь скорость вставки 10 к элементов меньше в около 1000 мс,чего я собственно и ждал Я ждал, что он тебе выдаст быстрее 200 мс на 10к записей, потому что я вставляю 15к за 200мс с передачей json'а этих самых записей по сети. То есть хуже, чем я делать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2021, 05:59 |
|
|
start [/forum/topic.php?fid=53&msg=40085385&tid=1993927]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 258ms |
total: | 404ms |
0 / 0 |