@BatchFetch type JOIN

Я запутался в этой аннотации для поля сущности, которое имеет тип другой сущности:

@BatchFetch(value = BatchFetchType.JOIN)

В документах EclipseLink для BatchFetch они объясняют это следующим образом:

Например, рассмотрим объект с таблицами EMPLOYEE и PHONE, в котором PHONE имеет внешний ключ для EMPLOYEE. По умолчанию для чтения списка адресов сотрудников по умолчанию требуется n запросов для каждого адреса сотрудника. При пакетной загрузке вы используете один запрос для всех адресов.

но я не понимаю смысла определения BatchFetchType.JOIN, Я имею в виду, BatchFetch не выполняет объединение в тот момент, когда он получает список записей, связанных с сотрудником? Записи адреса / типа телефона извлекаются с использованием внешнего ключа, так что это само соединение, верно?
Тип BatchFetch является необязательным параметром, и для объединения сказано:

JOIN - Критерии выбора исходного запроса объединяются с пакетным запросом.

что это значит? Разве пакетный запрос не является соединением?

1 ответ

Соединение отношений и возврат ссылочных данных с основными данными является выборочным соединением. Таким образом, запрос, который вводит 1 сотрудника с 5 телефонами, приводит к возвращению 5 строк с дублированием данных в сотруднике для расширенной строки. Когда это не так идеально, скажем, запрос более 1000 сотрудников, вы прибегаете к отдельному пакетному запросу для этих телефонных номеров. Такой запрос будет выполнен один раз, чтобы вернуть 1000 строк сотрудника, а затем выполнить второй запрос, чтобы вернуть все телефоны сотрудников, необходимые для построения считывания сотрудников.

Три типа пакетных запросов, перечисленные здесь, определяют, как будет построен этот второй пакетный запрос. Они будут работать по-разному в зависимости от данных и настройки базы данных.

  • JOIN - работает почти так же, как и при извлечении соединения, за исключением того, что он возвращает только данные телефона.
  • EXISTS - Это заставляет БД выполнить начальный запрос для сотрудников, но использует данные в подзапросе Exists, чтобы затем извлечь телефоны.
  • IN - EclipseLink объединяет все идентификаторы или значения сотрудников, используемые для ссылки на телефоны, и использует их для прямой фильтрации телефонов.

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

Другие вопросы по тегам