2013-10-14 1 views
0

기준 및 왼쪽 가입을 사용하여 성능 문제가 있습니다. 이제최대 절전 모드 기준의 Performace 문제 + 가입

Criteria crit = session.createCriteria(CuttingAssignment.class); 
    crit.add(Restrictions.eq("cuttingMachine", cuttingMachine)); 
    crit.createAlias("cuttingBatch", "cuttingBatch"); 
    crit.addOrder(Order.asc("psn")); 
    crit.setFetchMode("cuttingBatch", FetchMode.JOIN); 
    crit.setFetchMode("cuttingMachine", FetchMode.JOIN); 
    crit.createAlias("cuttingBatch.isolatingBatches", "cuttingBatch.isolatingBatches", Criteria.LEFT_JOIN); 
    crit.createAlias("cuttingBatch.isolatingBatches.assignments", "cuttingBatch.isolatingBatches.assignments", Criteria.LEFT_JOIN); 
    crit.createAlias("cuttingBatch.articleType", "cuttingBatch.articleType"); 
    crit.setFetchMode("cuttingBatch.articleType", FetchMode.JOIN); 
    crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
    List<CuttingAssignment> cuttingAssignmentList = crit.list(); 

그것이 내가 성능 문제에 직면하고 있기 때문에 그 DB에 너무 많은 SQL 쿼리를 실행합니다 : 다음은 내 쿼리입니다?

기준 쿼리를 최적화하는 방법은 무엇입니까? 기준과 HQL 쿼리간에 차이가 있습니까?

미리 감사드립니다.

+1

최대 절전 모드에서 보낸 SQL 요청을 먼저 확인해야합니다. 예를 들어 http://stackoverflow.com/questions/1710476/print-query-string-in-hibernate-with-parameter-values를 참조하십시오. 그런 다음 JOIN에 대한 올바른 색인이 있는지 확인하십시오. – Guillaume

+0

로그 수준을 위로 설정하여이 쿼리에 사용 된 SQL을 확인한 다음 EXPLAIN PLAN을 사용하여 수동으로 실행하려고 시도 했습니까? – beny23

답변

0

예, HQL은 기준보다 훨씬 효율적이고 간단합니다. SQL을 모르면 Criteria 쿼리를 사용하여 이해할 수 있지만 전반적으로 HQL을 선호합니다.

+0

이것은 약간의 일반화이며 항상 사실이 아닐 수도 있습니다. 특정 시나리오에 의존 할 것입니다. 왜냐하면 나는 조건 쿼리에 의해 쉽게 수행되는 HQL을 잘못 작성했다고 생각하기 때문입니다. – beny23

0

비교를 위해 HSQL을 게시하십시오. 일반적으로 HSQL은 데이터베이스에 하나의 문장만을 보내고, Criteria API는 게으른 연관의 수에 따라 둘 이상을 보낼 수있다. 외부 조인을 사용하여 하나의 쿼리에서 게으른 연결을 가져 오려면 Criteria Query 단락 15.5를 확인하십시오.