Hibernate Subselect vs Batch Fetching - PullRequest
       44

Hibernate Subselect vs Batch Fetching

13 голосов
/ 30 августа 2011

Hibernate предоставляет (как минимум) два варианта решения проблемы N + 1.Один из них устанавливает FetchMode на Subselect, который генерирует выбор с предложением IN и выбором внутри этого предложения IN.Другой - указать BatchSize, который генерирует выбор с предложением IN, содержащим идентификаторы родителей.

Оба работают, но я считаю, что опция Subselect часто сталкивается с проблемами производительности из-за запроса для родителейбыть сложным.С другой стороны, с большим BatchSize (скажем, 1000) число запросов и сложность этих запросов очень малы.

Мой вопрос таков: когда вы будете использовать Hibernate Subselect FetchMode вместо BatchSize?Подвыбор, вероятно, имеет смысл, если у вас есть очень большое количество родительских записей (тысяч), но есть ли другие сценарии, в которых вы бы предпочли Подвыбор BatchSize?

РЕДАКТИРОВАТЬ: я заметил разницу междуиметь дело с нетерпеливой загрузкой.Если у вас есть ассоциация xToMany, загружаемая с энтузиазмом и через подвыбор, она генерирует подвыбор, как если бы она была ленивой.Однако, если вы укажете BatchSize, сгенерированный запрос использует внешнее соединение, а не отдельный запрос.Есть ли способ заставить Hibernate использовать отдельный пакетный запрос при загрузке с нетерпением?

Ответы [ 2 ]

13 голосов
/ 30 августа 2011

Я не использую подвыбор, потому что это трудно контролировать.В очень большой системе, которая имеет сложную бизнес-логику и над ней работает большая команда, слишком сложно сказать, какие запросы используются.Подвыбор может работать в определенных случаях, когда вы точно знаете, какой запрос выполняется.

Пакетная выборка имеет некоторые большие преимущества.Это не всегда самый быстрый, но обычно достаточно быстрый.С другой стороны, он очень стабилен, не имеет побочных эффектов и полностью прозрачен для бизнес-логики.Я никогда не использую пакетные значения выше 100. Достаточно уменьшить N + 1 до некоторого разумного количества запросов.

2 голосов
/ 29 июня 2012

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

В случае стратегии выборки для коллекций подвыбор будет выполняться один раз (поскольку размер пакета фактически равен бесконечности), тогда как при пакетной выборке оператор SQL может выполняться несколько раз.

...