Hibernate 5 Поддержка собственных запросов - Медленная генерация ответов - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь получить 1000 строк, используя Hibernate createNativeQuery.Запрос содержит два объединения.Когда я выполняю то же самое в SQL-разработчике, я вижу, что ответ приходит менее чем за 400 мс, но из кода требуется 20 секунд, чтобы получить результат.

Таблица

Идентификатор сотрудника, имя, идентификатор страны, dept_id

Страна - идентификатор, имя страны, office_count, инфляция_100 *

Депт - идентификатор,dept_name, manager

String queryStr = "Select e.id as id, e.name as empName, c.country_name AS countryName,
    d.dept_name AS deptName FROM  owner.Employee AS e LEFT OUTER JOIN owner.Country c
        ON e.country_id = c.id LEFT OUTER JOIN owner.Dept AS d ON e.country_id = d.id";

List<Object[]> rows  = this.getSession().createNativeQuery(queryStr).setMaxResults(1000)
    .addScalar( "id", StringType.INSTANCE )
    .addScalar( "empName", StringType.INSTANCE )
    .addScalar( "countryName", StringType.INSTANCE )
    .addScalar( "deptName", StringType.INSTANCE )
    .list();

Какая дополнительная обработка, выполняемая Hibernate, может вызывать эту задержку?Можно ли как-нибудь оптимизировать код?

1 Ответ

1 голос
/ 15 июня 2019

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

Если вы хотите значительно ускорить свой запрос, вам нужно подумать о настройке и оптимизации.Вот одна стратегия индексирования, которая должна помочь:

CREATE INDEX country_idx ON Country (id, country_name);
CREATE INDEX dept_idx ON Dept (id, dept_name);

В этой стратегии предполагается, что Oracle выполнит полное сканирование таблицы на таблице Employee.Вышеупомянутые два индекса позволят быстрый поиск для каждой записи, участвующей в объединении.

...