Проблема с разбивкой на страницы в спящем режиме
I есть проблема, связанная с разбивкой на страницы в Hibernate, и в некоторой степени это было объяснено в
Использование ScrollableResults Hibernate для медленного чтения 90 миллионов записей
Hibernate - разбиение на страницы HQL
Проблемы с разбиением на страницы и Сортировка
Пагинация строк в спящем режиме
Подробности
Запрос HQL из приложения:
Query q = session.createQuery("from RequestDao r order by r.id desc");
q.setFirstResult(0);
q.setMaxResults(50);
Запрос возвращает 3 миллиона записей, и для разбивки на страницы мы устанавливаем только 50 из этих записей, страница разбивки на страницы выполняется очень медленно, потому что при каждом обновлении мы вызывая запрос, который получает 3 миллиона записей, и из них мы устанавливаем только 50 записей.
Мой главный вопрос:
Всегда ли HQL обращается к базе данных или же он обращается к сеансу или памяти для поиска данных, и если он каждый раз обращается к базе данных и получает набор результатов, то это очень правильно с точки зрения производительности Каковы были бы лучшие решения для его улучшения?
Используя HQL в спящем режиме, можно ли запросить базу данных и получить сначала только 50 записей, а затем получить другие записи по требованию пользователя.Эта проблема действительно мешает работе приложения, поэтому как лучше всего решить эту проблему?
HQL-запрос, созданный в журналах
from com.delta.dao.RequestDao r order by r.id desc
Hibernate Generated Query
select
getrequest0_.ID as ID24_,
getrequest0_.TIME as START3_24_,
getrequest0_.STAT as STATUS24_,
getrequest0_.SUM as SUMMARY24_,
getrequest0_.OUTNAME as OUTPUT7_24_,
getrequest0_.INPNAME as INPUT8_24_,
getrequest0_.REQUEST_DATE as requestT9_24_,
getrequest0_.PARENT_ID as PARENT10_24_,
getrequest0_.INTER_TYPE as INTERPO60_24_,
getrequest0_.OPEN_INT as OPEN61_24_,
getrequest0_.SOURCE_TYPE as SOURCE62_24_,
getrequest0_.TARGET_TYPE as TARGET20_24_,
getrequest0_.SOURCE as SOURCE14_24_,
getrequest0_.COPY_DATA as COPY16_24_,
getrequest0_.CURVE as GENERATE63_24_,
getrequest0_.TITLE as TITLE24_,
getrequest0_.TIME_ID as TIMESERIES12_24_,
getrequest0_.TASK_NAME as TASK51_24_
from
REQUEST getrequest0_
where
getrequest0_.KIND='csv'
order by
getrequest0_.ID desc
Вот Explain Plan для запроса :
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | | 1 | SIMPLE | getrequest0_ | ref | TR_KIND_ID | TR_KIND_ID | 6 | const | 1703018 | 100.00 | Using where |
Дополнительная информация: Время выполнения запроса с предложением order by и без него для ограничения на 50 записей
Если я выполняю запрос с предложением order
, то запрос занимает 0,0012 с с параметром LIMIT 50
и без условия заказа
, один и тот же запрос занимает 0,0032 секунды с таким же LIMIT 50
.
Также как мы можем узнать, если:
Также в моем нижеупомянутом запросе:
a) Query q = session.createQuery ("from RequestDao r order by r.id desc");
б) q.setFirstResult (0);
в) q.setMaxResults (50);
в a, правда ли, что мы получаем результат из базы данных и сохраняем его в памяти, или где, если нет, и в настоящее время у нас есть 3 миллиона результатов в наборе результатов, а затем в b и c мы устанавливаем значение смещения и ограничиваем и т. Д. На странице мы увидим только 50 результатов, поэтому теперь, где осталось 3 миллиона записей, и при нашем втором вызове этого запроса мы снова идем и нажимаем базу данных, получаем 3 миллиона записей и помещаем их в память, а затем на c снова мы устанавливаем 50 записей и продолжай.
Эта проблема мне непонятна, и я был бы очень признателен, если бы кто-нибудь мог дать четкое и подробное объяснение того, как это работает, и какое было бы лучшее решение для этой проблемы.
Обновление
Как выяснилось, проблема не связана с отображением записей на странице, но у меня есть фильтр на этой странице, и при каждом запросе я снова получаю все выпадающие значения из базы данных, и есть некоторые забавные там что-то происходит, что приводит к увеличению времени загрузки страницы.
Я делаю несколько вложенных запросов гибернации к базе данных и получаю результаты, что было бы оптимальным решением этой проблемы?