我有了性能下降下面的查询方法:慢速执行OpenJPA的查询
@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;
}
表有大约1.3M的记录,但在要素类的指标,F.id是主键。我在等待结果早在类似的格式如下:
机场 - > 20316 大桥> 6509 等
LinkedHashMap的是一个要求,所以我可以保持按键的顺序(它要么是或者稍后调用Collections.sort()...现在支付一笔款项或支付以后的东西)。
表定义低于:
CREATE TABLE FEATURE( FEATUREID INTEGER, FEATURENAME VARCHAR(100), 要素类VARCHAR(100), LAT NUMERIC(14,5), LNG NUMERIC(14, 5), FEATURESOURCE VARCHAR(10), PRIMARY KEY(FEATUREID) )ENGINE = InnoDB;
在FEATURE(FEATURECLASS)上创建索引idx_featureclass;
任何帮助表示赞赏。
杰森
你看过查询的执行计划吗?这将告诉你什么索引,寻找/扫描你正在使用 – Sean 2011-06-07 19:41:29
'COUNT(DISTINCT F.id)'似乎没有必要。 'COUNT(1)'会给你同样的结果。 – 2011-06-07 19:44:26
你是否像普通的SQL查询一样运行相同的查询?只是为了确保缓慢只是JPA而不是整个查询。 – deltaforce2 2011-06-07 19:44:29