Как я могу решить проблему выбора N + 1? - PullRequest
6 голосов
/ 07 апреля 2010

Мне трудно понять, как избежать выбора n + 1 в jpa или hibernate.

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

Может кто-нибудь объяснить мне или дать ссылку с четким полным объяснением, пожалуйста?

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

Спасибо

1 Ответ

8 голосов
/ 07 апреля 2010

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

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

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

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

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

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