Как я могу разрешить, что N+1 Выбирает проблему?

Я испытываю затруднения при понимании, как избежать выбора n+1 в jpa или быть в спящем режиме.

Из того, что я читал, существует 'левая выборка соединения', но я не уверен, работает ли она все еще больше чем с одним списком (oneToMany)..

Кто-то мог объяснить это мне или дать мне ссылку с четким полным объяснением?

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

Спасибо

6
задан Maxime ARNSTAMM 7 April 2010 в 13:58
поделиться

1 ответ

Помимо соединения, вы также можете использовать подзапросы.Это приводит к выполнению 2 запросов (или, как правило, m + 1, если у вас есть m списков), но он также хорошо масштабируется для большого количества списков, в отличие от выборки соединений.

При объединенной выборке, если вы извлекаете 2 таблицы (или списки) с вашим объектом, вы получаете декартово произведение , то есть все комбинации пар строк из двух таблиц. Если таблицы большие, результат может быть огромным , например если в обеих таблицах 1000 строк, декартово произведение содержит 1 миллион строк!

Лучшей альтернативой для таких случаев является использование подзапросов. В этом случае вы должны выполнить 2 выбора - по одному для каждой таблицы - поверх основного выбора (который загружает родительский объект), поэтому в целом вы загружаете 1 + 100 + 100 строк с 3 запросами.

Для записи то же самое с отложенной загрузкой приведет к 201 отдельным выборкам, каждая из которых загружает одну строку.

Обновление: вот несколько примеров:

8
ответ дан 16 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

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