2010-03-09 27 views
5

Ben hazırda veritabanı sorgularını optimize etmek deneyin nereye yabancı tuşu kullanıldığında gereksiz kaçınmak katılmak, ama engelleyici bulundu:hazırda - fıkra

<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> 

Ülke birincil anahtar CTRY_CD_ID olduğunu. Ben aşağıdaki kriterleri

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

çalıştırırsanız O hazırda ctry ve AR_SUPPORTED_LANG tabloyu birleştiren görebilirsiniz. Neden? Ben ilk sorguyu çalıştırmak için hazırda bekletme zorlayabilirsiniz Oldukça

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

daha

select * from AR_SUPPORTED_LANG where ctry_cd_id=? 

sql çalıştırmak için daha iyi olurdu?

cevap

1

Neden? Çalıştırmak daha iyi olur ...

Bu kesinlikle doğru değildir ve aslında veritabanınızın sorgularını nasıl en iyi duruma getirdiğine bağlıdır. Genel olarak konuşmak gerekirse, iç bağlantı daha verimli olacaktır çünkü arama kapsamını büyük ölçüde azaltma imkânı vardır. Tabii ki, sadece bir çift düzine satır ile basit tip tablo ile overkill gibi görünüyor. Birkaç milyon satır ekleyin ve farkı göreceksiniz.

Benzer bir nedenle, birleştirebileceğiniz tüm sorgu ipuçlarını eklemek genellikle en uygun seçenektir. Örneğin (HQL sorgunuzu yeniden yazma): fıkra İLE

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

... olmalı ...

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

ifadeleri JOIN ekleyerek VE cümleleri bir HQL özgü bir yöntemdir.

1

açıkça kriterleri modunu getirme ayarı deneyin:

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

Sanırım onu ​​işaretleyebilirsiniz. Sen ülke nesne üzerinde doğrudan eq uygulamalıdır:

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

O yol, ben de hatırlarsanız, sorgu istediğiniz şekilde optimize etmelidir hazırda bekletme. Ancak bu, yalnızca ülke kodunu değil, ülke nesnesine ihtiyacınız olduğu anlamına gelir.

+0

Unfortunatelly Nesne yok, sadece ülke kodu :-( – HamoriZ

+0

Ülke ülke tablosunun kimliğini kodluyor mu? Evet ise, nesneyi elle yüklemezseniz, hazırda bekletme db, id alanını doldurduğunuz sürece (örneğin: crit.add (Restrictions.eq ("Ülke", yeni CountryVO (p_country_code)));) – Thierry