Прямо сейчас вы, вероятно, вообще не используете индекс. Существует некоторая неоднозначность того, как лимит / смещение гибернации будут переводиться в операции с базой данных (см. этот комментарий в случае postgres). Это может подразумевать накладные расходы, как подробно описано в ответе на это сообщение .
Если у вас есть прямая зависимость от смещения и ограничения значений столбца id, вы можете использовать это взапрос вида
SELECT e
FROM Entity
WHERE id >= offset and id < offset + limit
Учитывая, что количество запрашиваемых записей значительно меньше, чем общее количество записей в таблице, база данных будет использовать индекс.
Следующее,что 40 столбцов это совсем немного. Если вам действительно нужно значительно меньше для вашей цели, вы можете определить ограниченную сущность только с необходимыми атрибутами и запросить ее. Это потребует некоторых дополнительных затрат.
Если вы все еще не соответствуете требованиям к производительности, вы можете выбрать соединение / запрос jdbc вместо использования hibernate.
Btw. вы можете зарегистрировать фактический sql, выпущенный jpa / hibernate, и использовать его для получения плана выполнения от postgress, это покажет вам, как на самом деле выглядит запрос, и будет ли индекс использоваться или нет. Кроме того, вы можете отслеживать время выполнения запросов к базе данных, чтобы понять, какая часть времени обработки затрачивается ею, а какая - вашим клиентом java, а также накладные расходы на передачу данных.