我试图选择一些文档表列并将其映射到新对象中,而不是整体返回文档。我非常担心以下查询的执行时间,因为大约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);
答案 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
等同于OR
。 IN
上的许多itens在SQL上意味着很多OR
,这通常是数据库难以优化的。
如果查询仍然很慢,则要查找的第二个地方是DISTINCT
。 DISTINCT
有时可以GROUP BY
be replaced来提高性能。