문제

Hibernate에서 데이터베이스 쿼리를 최적화하려고하지만 차단제를 찾았습니다.

<class name="SupportedLanguageVO" table="AR_SUPPORTED_LANG" >
    <cache usage="read-only"/>
 <id name="Id" type="java.math.BigInteger">
  <column name="ID" sql-type="NUMBER(20)" not-null="true"/>
  <generator class="assigned"/>
 </id>
    <property name="OrderSeq" type="java.math.BigInteger">
  <column name="ORDER_SEQ" sql-type="NUMBER(20)" not-null="true"/>
 </property>
    <many-to-one name="Country" class="CountryVO" column="CTRY_CD_ID" cascade="none" >
    <many-to-one name="Language" class="LanguageVO" column="LANG_CD" cascade="none" >

    </class>

국가의 주요 열쇠는입니다 CTRY_CD_ID. 다음 기준을 실행하는 경우

  Criteria crit = m_Session.createCriteria(SupportedLanguageVO.class);
            crit.createCriteria("Country").add(Restrictions.eq("_CountryCode", p_countrycode));
            crit.addOrder(Order.asc("OrderSeq"));

최대 절전 모드가 CTRY와 AR_SUPPORTED_LANG 테이블에 합류 한 것을 볼 수 있습니다. 왜요? 달리는 것이 더 낫습니다

select * from AR_SUPPORTED_LANG where ctry_cd_id=?

SQL보다는

select * from AR_SUPPORTED_LANG inner join ctry .... where ctry_cd_id=?

최대 절전 모드가 첫 번째 쿼리를 실행하도록 강요 할 수 있습니까?

도움이 되었습니까?

해결책

왜요? 달리는 것이 더 낫습니다 ...

반드시 사실은 아니며 실제로 데이터베이스가 쿼리를 최적화하는 방식에 크게 의존합니다. 일반적으로 내부 결합은 검색 범위를 크게 줄일 수있는 기회가 있기 때문에 더 효율적입니다. 물론 수십 개의 행만있는 간단한 유형 테이블을 사용하면 과잉처럼 보입니다. 2 백만 행을 추가하면 차이가 보입니다.

비슷한 이유로 일반적으로 조인 할 수있는 쿼리 힌트를 추가하는 것이 최적입니다. 예를 들어 (HQL에서 쿼리를 다시 쓰기) :

from AR_SUPPORTED_LANG inner join ctry c where c.cd_id=?

...해야한다...

from AR_SUPPORTED_LANG inner join ctry c WITH c.cd_id=?

with 절은 HQL- 특이 적 추가 방법이며 진술에 가입하기위한 조항입니다.

다른 팁

기준에 대한 페치 모드를 명시 적으로 설정해보십시오.

crit.setFetchMode("Country", FetchMode.SELECT);

나는 당신이 그것을 점령 할 수 있다고 생각합니다. 국가 객체에 EQ를 직접 적용해야합니다.

Criteria crit = m_Session.createCriteria(SupportedLanguageVO.class);
crit.add(Restrictions.eq("Country", p_country));
crit.addOrder(Order.asc("OrderSeq"));

그렇게하면 잘 기억한다면 최대 절전 모드는 원하는 방식으로 쿼리를 최적화해야합니다. 그러나 그것은 국가 코드뿐만 아니라 국가 대상이 필요하다는 것을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top