2011-06-07 48 views
1

我有了性能下降下面的查詢方法:慢速執行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;

任何幫助表示讚賞。

傑森

+0

你看過查詢的執行計劃嗎?這將告訴你什麼索引,尋找/掃描你正在使用 – Sean 2011-06-07 19:41:29

+1

'COUNT(DISTINCT F.id)'似乎沒有必要。 'COUNT(1)'會給你同樣的結果。 – 2011-06-07 19:44:26

+1

你是否像普通的SQL查詢一樣運行相同的查詢?只是爲了確保緩慢只是JPA而不是整個查詢。 – deltaforce2 2011-06-07 19:44:29

回答

2

COUNT(DISTINCT F.id)似乎沒有必要。 A COUNT(1)會給你相同的結果。並可能更好的表現;-)。

+0

運行良好。謝謝。 – Jason 2011-06-08 00:13:19