2010-03-09 8 views
5

내가 최대 절전 모드에서 데이터베이스 쿼리를 최적화하려고 곳에서 외래 키를 사용하는 경우 불필요한 피하면 가입,하지만 난 차단기를 발견최대 절전 모드 - 절

<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 inner join ctry .... where ctry_cd_id=? 

보다

select * from AR_SUPPORTED_LANG where ctry_cd_id=? 

SQL을 실행하는 것이 더 있을까?

답변

1

이유는 무엇입니까? 실행하는 것이 더 좋을 것입니다 ...

사실 반드시 그렇지는 않습니다. 실제로 데이터베이스가 쿼리를 최적화하는 방법에 크게 의존합니다. 일반적으로 검색 범위를 대폭 축소 할 수 있으므로 내부 참여가 더 효율적입니다. 물론, 수십 개의 열만있는 단순한 형식 테이블에서는 잔인한 것처럼 보입니다. 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=? 

은 문을 가입하기 위해 추가 및 조항의 HQL 고유의 방법이다.

1

명시 적 기준에 대한 모드를 가져 오기 설정 해보 :

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

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

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

그 방법을, 내가 잘 기억한다면, 쿼리 당신이 원하는 방식을 최적화해야 최대 절전 모드. 하지만 이는 국가 코드뿐만 아니라 국가 객체가 필요하다는 것을 의미합니다.

+0

Unfortunatelly 개체가 없습니다. 국가 코드 :-( – HamoriZ

+0

국가 코드가 국가 테이블의 ID입니까? 그렇다면 최대 절전 모드에서 개체를로드하지 않고 수동으로 만들면 최대 절전 모드가됩니다. db, id 필드를 채우는 한 (예 : crit.add (Restrictions.eq ("Country", new CountryVO (p_country_code));) – Thierry