최대 절전 모드 - WHERE 절에서 외국 키를 사용할 때 불필요한 조인 방지
-
18-09-2019 - |
문제
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"));
그렇게하면 잘 기억한다면 최대 절전 모드는 원하는 방식으로 쿼리를 최적화해야합니다. 그러나 그것은 국가 코드뿐만 아니라 국가 대상이 필요하다는 것을 의미합니다.
제휴하지 않습니다 StackOverflow