如何使用JPQL查询减少查询执行时间

时间:2019-02-28 23:37:04

标签: hibernate spring-boot jpql

我试图选择一些文档表列并将其映射到新对象中,而不是整体返回文档。我非常担心以下查询的执行时间,因为大约35,000个条目需要大约4200毫秒才能执行。什么是减少执行时间的最佳解决方案? 35,000个条目有4秒的好时机吗?

    @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 :(得分:0)

您可以开始组织JOIN。当您在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等同于ORIN上的许多itens在SQL上意味着很多OR,这通常是数据库难以优化的。

如果查询仍然很慢,则要查找的第二个地方是DISTINCTDISTINCT有时可以GROUP BY be replaced来提高性能。