【发布时间】: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:如果您作为答案发布,我会将其标记为已接受。