170 похожих чатов

Я пытался сейчас оптимизировать работу с хибернейтом в приложении, сделал

eager fetching через entity graph, чтобы доставать полную entity одним запросом, по итогу, запрос один, померил jprofiler'ом, сам запрос выполняется 18к наносекунд, а на уровне хибера 210 миллисекунд, это хибер такие накладные расходы несет? Даже с учетом маппинга, всяких query-кешэй, first-level кэшей и других абстракций это слишком, на мой взгляд.

37 ответов

11 просмотров

https://vimeo.com/267560432 - hibernate против jooq 🙂 Давнишнее видео, но недавно прилетело. Но вообще, там же есть общение по сети, создание объектов и прочая и прочая. Где конкретно просадка в производительности, выяснилось? Что именно оптимизируем?

Ilya-Starchenko Автор вопроса
Andrey Belyaev
https://vimeo.com/267560432 - hibernate против joo...

Сложно сказать, где именно просадка, так как я не вижу этого, в call stack'е просто нет той функции, которая сжирает 90% производительности, но я вижу разницу между jdbc-вызовом самого запроса и вызовом запроса из хибернейта, вероятно, можно попробовать через jstack записать, может тогда пойму. Оптимизируем обычный селект с джоином, он раньше lazy вытягивался, я решил сделать eager, чтоб не плодить запросы при определенных обстоятельствах, но там ботл неком, такое чувство, стал сам хибернейт.

Ilya Starchenko
Сложно сказать, где именно просадка, так как я не ...

А какой запрос генерируется? Сколько данных вытягивается? jdbc запрос мерился только для выполнения или rowmapper тоже отрабатывал?

Ilya-Starchenko Автор вопроса
Andrey Belyaev
А какой запрос генерируется? Сколько данных вытяги...

Обычный join fetch. 40 записей, и на каждую запись по две-три подзаписи, rowmapper не мерил, но не может быть же, что маппинг настолько долгий.

Ilya Starchenko
Обычный join fetch. 40 записей, и на каждую запись...

Его прямо видно в логах, что нужный делается? Не N+1 нигде?

Ilya-Starchenko Автор вопроса

возможно ты столкнулся с Cartesian Product Problem

Ilya Starchenko
Да, show-sql ставил, все красиво.

А если план разбора посмотреть этого запроса, как оно будет? У меня пока только мысль, что где-то что-то лишнее тянется.

Ilya-Starchenko Автор вопроса
Роман Нагаев
возможно ты столкнулся с Cartesian Product Problem

Я так понимаю, эта проблема связана с множественными джоинами, а у меня только одна коллекция.

Как то мало слишком, что запрос выполняется в базу за 18 микросекунд

Ilya-Starchenko Автор вопроса
Andrey Belyaev
А если план разбора посмотреть этого запроса, как ...

QUERY PLAN ----------------------------------------------------------------------------------------------------------------- Hash Right Join (cost=21.76..38.42 rows=109 width=981) Hash Cond: ((nodeporten1_.project_id = nodeentity0_.project_id) AND (nodeporten1_.node_id = nodeentity0_.id)) -> Seq Scan on node_ports nodeporten1_ (cost=0.00..15.45 rows=218 width=651) Filter: (project_id = '90686c22-9198-4f88-8e68-a37f41344a50'::uuid) -> Hash (cost=21.10..21.10 rows=44 width=282) -> Seq Scan on nodes nodeentity0_ (cost=0.00..21.10 rows=44 width=282) Filter: (project_id = '90686c22-9198-4f88-8e68-a37f41344a50'::uuid)

Ilya-Starchenko Автор вопроса
Vladimir Solonchenko
Как то мало слишком, что запрос выполняется в базу...

Действительно, врет jprofiler, 3 миллисекунды в analyze показал.

Ilya Starchenko
QUERY PLAN ---------------------------------------...

Ну выглядит не стремно, значит, надо копать в другом месте где-то. Т.е. хибер делает нормальный запрос, он быстро выполняется, но или путь туда занимает много времени (генерация SQL+сеть+ожидание выполнения), или обратно (сеть+обновление кэша+маппинг). Смотреть, что именно тупит. Можно попробовать сделать native SQL и выполнить через EntityManager, чтобы пройти мимо L1, если это он.

Ilya-Starchenko Автор вопроса
Andrey Belyaev
Ну выглядит не стремно, значит, надо копать в друг...

Это я на локальной базе проверял, попробую таки через native sql. Спасибо.

Ilya Starchenko
Это я на локальной базе проверял, попробую таки че...

Ну блин, если у тебя БД опирается на статистику при построении плана запроса, а она не обновлена, то все может знатно тупить. Если у тебя таблицы огромные, что может не быть HashJoin, например, в плане разбора. С другим набором данных будет другой план разбора. В идеале - смотреть план надо на стейджинге

Ilya-Starchenko Автор вопроса
Andrey Belyaev
Ну блин, если у тебя БД опирается на статистику пр...

Ну так проблема и локально, и на стейджинге, так что разницы большой нет.

ты пробовал сырой запрос запрос напрямую в базу отправлять?

Ilya-Starchenko Автор вопроса
Ilya Starchenko
Через jdbc? Нет. Через psql - да.

пэйджинация есть какая-то?

Да уж

Ilya Starchenko
Через jdbc? Нет. Через psql - да.

ты отправлял ровно то, что сгенерил хибер?

Ruslan
Да уж

А что не так? N+1 лучше что ли? Там запрос типа такого генерируется. Ничего криминального. ``` from nodes n left outer join node_ports np on n.id = np.node_id and n.project_id = np.project_id where n.project_id = '90686c22-9198-4f88-8e68-a37f41344a50'; ```

Ruslan
Должен летать по сути

Смотрите план запроса

Про горячий код слышал? Прогрев ВМ? Ты сейчас измерил температуру на Марсе своим комнатным термометром

Ilya Starchenko
Сложно сказать, где именно просадка, так как я не ...

Ты уверен что тебе нужен Игорь для вытягивания ща раз?) Ты читал как он работает?)

Ilya Starchenko
QUERY PLAN ---------------------------------------...

Табличка маленькая, чему там долго тянуться

Ilya-Starchenko Автор вопроса
Alexandr ∨∧‾ Emelyanov
Ты уверен что тебе нужен Игорь для вытягивания ща ...

Ты же видел, что я там написал, что делаю eager fetching через entity граф?

Ilya-Starchenko Автор вопроса
Alexandr ∨∧‾ Emelyanov
Про горячий код слышал? Прогрев ВМ? Ты сейчас изме...

Честно говоря, не совсем понимаю, о чем ты, я же вижу, что работает медленно, и по call stack'у и эмпирически.

Ilya Starchenko
Честно говоря, не совсем понимаю, о чем ты, я же в...

Ты как замерял? Сколько раз? Запустил и тут же один раз дёрнул и посмотрел результат?

Ilya-Starchenko Автор вопроса
Alexandr ∨∧‾ Emelyanov
Ты как замерял? Сколько раз? Запустил и тут же оди...

Сделал 10 запросов, посмотрел среднее, открыл call stack, посмотрел, какие запросы самые долгие, оптимизировал их, и так циклично, пока не дошел до этого.

Ну когда начинаешь что-то оптимизировать, неплохо было бы сначала погонять бенчмарки на гретой jvm, а потом уже оптимизированный код измерять

vorobyoff
Ну когда начинаешь что-то оптимизировать, неплохо ...

Там SQL оптимизируется. Температура джвм не особенно показательна будет в этом случае.

Похожие вопросы

Обсуждают сегодня

Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Добрый день! Подскажите, пожалуйста: какими компетенциями нужно обладать, чтобы претендовать на работу эрланг (отдельная благодарность, если про элексир тоже подскажете) разр...
via ☸️ led
20
Всем привет. Ребят подскажите пожалуйста. Вопрос по дизасемблировани. Начну с начала. У меня есть скомпилированная программа на ГО (я разработчик) - в ней есть защита лицензии...
Zloy
11
Можно попросить небольшое ревью кода? Тут немнога, я ничего интереснее не придумал, чем написать аналог tree в качестве практики с cmake. https://github.com/hrimov/tree-unix/...
Andrew Hrimov
11
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Карта сайта