【问题标题】:JPQL Constructor execution takes long timeJPQL 构造函数执行需要很长时间
【发布时间】:2018-01-01 18:41:38
【问题描述】:

我在我的代码中使用 JPQL 构造函数。它涉及大量结果、检索到的 5024 个数据以及在执行此查询时创建的对象。完成执行大约需要 2 分钟。执行此查询涉及多个表。我不能去缓存,因为数据库数据会每天更新。有什么办法可以优化执行速度?

我的SQL查询形成是这样的,

String sql = "SELECT DISTINCT "
                  + "new com.abc.dc.entity.market.LaptopData(vd.segment.id, vd.segment.segmentGroup, "
                  + "vd.segment.segmentName, vd.segment.category, "
                  + "vd.product.make, vd.product.model, vd.product.modelYear) "
                  + "FROM LaptopData vd, Profile p "
                  + "WHERE vd.profile.profileCode = :profileCode "
                  + "AND vd.pk.profileId = p.id "
                  + "Order By vd.segment.segmentGroup, vd.segment.segmentName, vd.product.make, vd.product.model,"
                  + " vd.product.modelYear asc";
Query query = em.createQuery(sql);
query.setParameter("profileCode", profileCode);

@SuppressWarnings("unchecked")
List<LaptopData> results = query.getResultList();

em.clear();
return results;

【问题讨论】:

  • 查看了执行的生成SQL?时间都花在了哪里?

标签: java sql jpa jpql


【解决方案1】:

好吧,您的一个选择是创建一个单独的表,该表将包含所有实体的此查询的结果并每天(每晚)更新它,然后在这个新表上运行您的查询,如下所示:

"SELECT DISTINCT"
              + "new com.abc.dc.entity.market.LaptopData(m.id, m.segmentGroup, "
              + "m.segmentName, m.category, "
              + "m.make, m.model, m.modelYear) "
              + "FROM someNewTable m"
              + "WHERE m.profileCode = :profileCode ";

这样,您不必在每次执行查询时都进行连接和排序,而每天只需在生成新表时进行一次。当然,使用这种方法来查看数据更新,您必须等到重新创建新表。

此外,您可以在 where 子句中使用的字段上创建索引。

【讨论】:

  • 但是在这里我没有发现检索数据有任何时间延迟。但我想时间会因对象创建而增加。我不确定使用 JPQL 构造函数在屏幕后面究竟发生了什么。但它听起来像每个获取的行对象都是立即创建的。有什么办法可以加快对象创建速度?
  • 你测试了吗?你有任何分析器输出吗?您无法解决对象创建问题,并且在 java 中它非常快。我认为这种情况下大多数性能繁重的操作是 Order by 语句。
  • 是的,没错。问题不在于对象创建。即使我使用本机查询来获取它也需要很长时间。
猜你喜欢
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2012-12-03
  • 2011-03-14
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多