Выберите все записи от смещения до ограничения, используя индекс postgres - PullRequest
0 голосов
/ 15 октября 2019

Я хочу получить все данные от смещения к пределу из таблицы с 40 столбцами и 1 000 000 строк. Я попытался проиндексировать столбец id с помощью postgres и получить результат моего запроса на выборку с помощью java и управления данными.

Мой запрос требует около 1 минуты, чтобы получить мои результаты, что является слишком длинным. Я пытался использовать другой индекс, а также ограничил свой запрос до 100, но на этот раз все еще нужно. Как я могу это исправить? Мне нужен лучший индекс или что-то не так с моим кодом?

CriteriaQuery<T> q = entityManager.getCriteriaBuilder().createQuery(Entity.class);
TypedQuery<T> query = entityManager.createQuery(q);
List<T> entities = query.setFirstResult(offset).setMaxResults(limit).getResultList();

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Прямо сейчас вы, вероятно, вообще не используете индекс. Существует некоторая неоднозначность того, как лимит / смещение гибернации будут переводиться в операции с базой данных (см. этот комментарий в случае postgres). Это может подразумевать накладные расходы, как подробно описано в ответе на это сообщение .

Если у вас есть прямая зависимость от смещения и ограничения значений столбца id, вы можете использовать это взапрос вида

SELECT e
FROM Entity
WHERE id >= offset and id < offset + limit

Учитывая, что количество запрашиваемых записей значительно меньше, чем общее количество записей в таблице, база данных будет использовать индекс.

Следующее,что 40 столбцов это совсем немного. Если вам действительно нужно значительно меньше для вашей цели, вы можете определить ограниченную сущность только с необходимыми атрибутами и запросить ее. Это потребует некоторых дополнительных затрат.

Если вы все еще не соответствуете требованиям к производительности, вы можете выбрать соединение / запрос jdbc вместо использования hibernate.

Btw. вы можете зарегистрировать фактический sql, выпущенный jpa / hibernate, и использовать его для получения плана выполнения от postgress, это покажет вам, как на самом деле выглядит запрос, и будет ли индекс использоваться или нет. Кроме того, вы можете отслеживать время выполнения запросов к базе данных, чтобы понять, какая часть времени обработки затрачивается ею, а какая - вашим клиентом java, а также накладные расходы на передачу данных.

0 голосов
/ 15 октября 2019

Существует также метод, позволяющий имитировать пейджинг смещения + предела, используя пейджинг на основе ключа .

. *1003*
Map<Integer, String> mapPageTopRecNoToKey = new HashMap<>();

первой записи страницы. Затем поиск записей> = ключ страницы и загрузкаразмер страницы + 1 запись для поиска следующей страницы.

Переход со страницы 1 на страницу 5 потребовал бы немного больше работы, но все равно был бы быстрым.

Это, конечно, ужасный шаг,но метод того времени действительно улучшал скорость некоторых баз данных.


В вашем случае стоило бы указать необходимые поля в jpql: select e.a, e.b значительно быстрее.

...