【问题标题】:Slow Performing OpenJPA Query执行缓慢的 OpenJPA 查询
【发布时间】:2011-09-10 08:50:06
【问题描述】:

我有以下查询方法,性能很慢:

@Override
public Map<String, Long> getFeatureCounts() {

    StopWatch timer = new StopWatch();
    timer.start();
    Map<String, Long> resultMap = new LinkedHashMap<String, Long>();  // I want to ensure that the features are in alpha order

    EntityManager em = entityManagerFactory.createEntityManager();

    String jpaQuery = "SELECT F.featureClass, COUNT(DISTINCT F.id) FROM Feature F GROUP BY F.featureClass ORDER BY F.featureClass";
    Query query = em.createQuery(jpaQuery);

    List resultList = query.getResultList();

    for (Object o : resultList) {
        Object[] o2 = (Object[]) o;
        String key = (String) o2[0];
        Long value = (Long) o2[1];
        resultMap.put(key, value);
    }

    em.close();

    timer.stop();
    log.info("getFeatureCounts() executed in " + timer.getTime() + "ms.");

    return resultMap;
}

表有大约130万条记录,但是在featureClass上有一个索引,F.id是主键。我正在等待以下格式的结果:

机场->20316 网桥->6509 等等

LinkedHashMap 是一项要求,因此我可以维护键的顺序(要么就是这样,要么稍后调用 Collections.sort() ......一种现在付款或以后付款的事情)。

表定义如下:

创建表功能( 特征整数, 特征名称 VARCHAR(100), 特征类 VARCHAR(100), 纬度数字(14,5), 液化天然气数字(14,5), 特征源 VARCHAR(10), 主键(功能 ID) ) 引擎 = InnoDB;

在 FEATURE(FEATURECLASS) 上创建索引 idx_featureclass;

感谢任何帮助。

杰森

【问题讨论】:

  • 你看过查询的执行计划了吗?这将告诉您正在使用哪些索引、搜索/扫描
  • COUNT(DISTINCT F.id) 似乎没有必要。 COUNT(1) 会给你同样的结果。
  • 您是否运行了与普通 SQL 查询相同的查询?只是为了确保缓慢仅与 JPA 而不是整个查询有关。
  • 使用 COUNT(1) 给了我更好的性能。可能还有改进的空间,但现在已经足够了。 Kees:如果您作为答案发布,我会将其标记为已接受。

标签: java openjpa


【解决方案1】:

COUNT(DISTINCT F.id) 似乎没有必要。 COUNT(1) 会给你同样的结果。并且可能有更好的性能;-)。

【讨论】:

    猜你喜欢
    • 2014-01-16
    • 2020-04-23
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2019-04-04
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多