Использование списков в качестве столбцов приводит к снижению производительности - JPA - PullRequest
0 голосов
/ 13 апреля 2020

Я использую hibernate и заметил, что при использовании списков в качестве столбцов выборка из базы данных (findById) с помощью JpaRepository занимает много времени. В журналах я обнаружил, что запрос правильный:

select
    measuremen0_.data_id as dat1_3_0_,
    measuremen0_.measurements as measurem2_3_0_,
    measuremen0_.measurements_order as measurem3_0_ 
from
    data_measurements measuremen0_ 
where
    measuremen0_.data_id=?

, но после запроса происходит инициализация, которая занимает много времени, даже перемещение, чем сам запрос:

Preparing collection initializer:
Found row of collection:
Found row of collection:
Found row of collection:
... (times number of measurements)

Какова цель подготовки коллекции? это можно пропустить? Вот мой класс сущности:

@Entity
public class Data {

@Id
private long id;

@ElementCollection(fetch = FetchType.EAGER)
@OrderColumn
@Column(columnDefinition = "TEXT", updatable = false)
private List<String> measurements;

1 Ответ

1 голос
/ 13 апреля 2020

Стремительная загрузка любой коллекции может привести к снижению производительности. Обратите внимание, что большинству поставщиков сохраняемости потребуется как минимум N + 1 SELECT для базы данных, чтобы заполнить ваши данные - первый, который извлекает все сущности владельца, плюс один SELECT для каждого списка, который необходимо заполнить в каждой сущности. Если возможно в ваших требованиях, удалите нетерпеливую выборку и извлеките списки после выбора данных.

Использование TEXT в качестве columnDefinition может иметь большое влияние также из-за того, что некоторые базы данных вместо хранения данных в Обычные столбцы , перемещает каждый регистр в собственные регистры или файлы. Если вы можете, замените определение столбца на определение длины, что позволит базе данных лучше сохранять физически ваши данные и впоследствии сокращать запросы.

...