2015-03-19 3 views
3

У меня большая проблема с производительностью в моем приложении JPA. Предположим, у меня есть 3 сущности:Как оптимизировать запрос JPQ JOIN для быстрого запуска

class TaskResult { 
    Task task; 
} 

class Task { 
    User user; 
} 

class User { 
    Long id; 
} 

Теперь я хочу, чтобы получить список всех TaskResults для одного конкретного USERID, есть запрос будет что-то вроде:

SELECT * FROM TaskResult r WHERE r.task.user.id = :id 

И более 10000 записей это слишком медленно ! Есть ли другой способ обхода?

+0

Это метод JPA. В моем проекте я создаю 'view' в' database', и я привязываю это представление только для чтения 'Entity'. Он будет лучше работать ... – CycDemo

ответ

5
  1. Попробуйте ограничение ЗЕЬЕСТА только TaskRunner и использовать явные JOIN и:

    SELECT tr 
    FROM TaskResult tr 
    JOIN tr.task t 
    JOIN t.user u 
    WHERE u.id = :id 
    
  2. Включите все EAGER associations into LAZY ones и использовать FETCH на запросы основе.

  3. Убедитесь, что есть индекс на всех внешних ключей (Task.task_runner_id и User.task_id)

  4. Попробуйте выполнить запрос SQL ГЭЭ, если это так медленно тоже. Если SQL медленный, то Hibernate не может быть быстрее.

  5. Попробуйте выбрать меньшее количество столбцов из TaskRunner и вместо этого используйте проекцию.

  6. Вы говорите, что существует 10 000 строк, но вам наверняка не нужно отображать, что многие объекты в пользовательском интерфейсе. Попробуйте использовать keyset pagination, который масштабируется лучше, чем разбиение по умолчанию OFFSET (поддерживается большинством реализаций JPA).

Смежные вопросы