Как уменьшить время выполнения запроса с помощью JPQL-запроса - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь выбрать некоторые столбцы таблицы документа и отобразить их в новый объект, а не возвращать документ в целом.Я весьма обеспокоен временем выполнения следующего запроса, поскольку для выполнения около 35 000 записей требуется около 4200 мс.Что было бы лучшим решением для сокращения времени выполнения?Является ли 4 секунды хорошим временем для 35 000 записей?

    @Query("SELECT DISTINCT new it.homepackage.models.document.DocumentGetReviewCommand(" +
        "d.author.firstname, d.author.lastname, d.id, d.title, d.description, d.documentType.title, d.submissionDate)" +
        " FROM Document d" +
        " WHERE d.documentType IN :docTypes" +
        " AND d.documentState = it.homepackage.enums.DocumentState.SUBMITTED" +
        " AND :username <> d.author.username")
Page<DocumentGetReviewCommand> getDocumentsForReview(@Param(value = "username") String username,
                                                     Pageable pageable, 
                                                     @Param(value = "docTypes") List<DocumentType> docTypes);

1 Ответ

0 голосов
/ 01 марта 2019

Вы можете начать организовывать СОЕДИНЕНИЯ.Когда вы используете сложное «крушение поезда» среди сущностей на JPQL (например, entity1.entity2.entity3.name), Hibernate может генерировать странные (иногда недопустимые) SQL.

Во-первых, запрос может быть:

SELECT DISTINCT new it.homepackage.models.document.DocumentGetReviewCommand(" +
        "author.firstname, author.lastname, d.id, d.title, d.description, documentType.title, d.submissionDate)" +
        " FROM Document d" +
        " JOIN d.author author " +
        " JOIN d.documentType documentType " +
        " WHERE d.documentType IN :docTypes" +
        " AND d.documentState = it.homepackage.enums.DocumentState.SUBMITTED" +
        " AND :username <> author.username

Если запрос все еще медленный, возможно, причина в предложении IN.IN эквивалентно OR.Множество itens в IN означает большой OR в SQL, что обычно трудно оптимизировать для базы данных.

Если запрос все еще медленный, второе место для поиска - DISTINCT.DISTINCT может иногда быть заменен на GROUP BY для увеличения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...