السبات - تجنب الانضمام غير الضروري عند استخدام مفتاح أجنبي في حيث جملة

StackOverflow https://stackoverflow.com/questions/2410715

سؤال

أحاول تحسين استعلامات قاعدة البيانات في السبات، لكنني وجدت مانع:

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

هل يمكنني إجبار السبات على تشغيل الاستعلام الأول؟

هل كانت مفيدة؟

المحلول

لماذا ا؟ سيكون من الأفضل تشغيل ...

هذا ليس صحيحا بالضرورة، وفي الواقع يعتمد ذلك بشكل كبير على كيفية تحسين قاعدة البيانات الخاصة بك استفساراتها. بشكل عام، سيكون الانضمام الداخلي أكثر فعالية لأنه يحتوي على فرصة لتقليل نطاق البحث إلى حد كبير. بالطبع، مع طاولة نوع بسيط مع زوجين فقط من الصفوف تبدو وكأنها مبالغة. أضف بضعة ملايين صفوف وسترى الفرق.

لسبب مشابه، فمن الأمثل عموما لإضافة أي تلميحات للاستعلام التي يمكنك أن تنضم إليها. على سبيل المثال (أعد كتابة استفسارك في 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 للإضافة والطلاء للانضمام إلى البيانات.

نصائح أخرى

حاول إعداد وضع الجلب بشكل صريح لمعاييرك:

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