2010-12-07 2 views
2

Je fais une recherche sur l'une de mes tables (base de données existante) et je reçois un temps horrible ici. La requête est construite par des critères de mise en veille prolongée api, .: par exempleHibernate, DB2 - Demandes en cours d'exécution

Criteria crit = getSessionFactory().getCurrentSession().createCriteria(P1.class); 
crit.add(Restrictions.sqlRestriction("{alias}.compno like ?", "%" + s + "%", new StringType())); 
crit.setMaxResults(25); 
crit.setFirstResult(0); 
crit.addOrder(Order.asc("compno")); 
crit.list(); 

Comme vous pouvez le voir, je fais déjà une recherche de personnes ici pour améliorer la perfomance. Ce critère nécessite ~6 seconds en moyenne.

Eh bien la requête native qui ressemble à ceci

select * from SCHEM.P1 where compno like '%100%' order by compno fetch first 25 rows only 

ne prend que 10 ms ce qui est une énorme différence imo. Pourquoi les critères sont-ils si lents? Dois-je revenir à la requête SQL native?

Bon point sur les commentaires:

Oui, il y a des relations que je ne l'ai pas eu la portée:

<set name="pI" table="P12" lazy="false"> 
    <key column="awcompno" update="false" /> 
    <one-to-many class="org.gee.hibernate.P12" not-found="ignore"/> 
</set> 
<one-to-one name="info" class="org.gee.hibernate.P13" /> 

<set name="ma" table="P03" lazy="true" schema="SCHEMP" mutable="false" > 
    <key column="macountry" property-ref="land" update="false" /> 
    <one-to-many class="org.gee.hibernate.P03" not-found="ignore" /> 
</set> 


<set name="users" table="P15" lazy="true"> 
    <key column="apcompno" update="false" /> 
    <one-to-many class="org.gee.hibernate.P15" not-found="ignore"/> 
</set> 
+0

Besoin d'un renseignement: Utilisez-vous un à plusieurs/plusieurs à un/plusieurs à plusieurs dans votre entité? –

+0

a mis à jour ma question cependant. – onigunn

Répondre

3

Mon conseil est:

<set name="pI" table="P12" lazy="false"> 
    <key column="awcompno" update="false" /> 
    <one-to-many class="org.gee.hibernate.P12" not-found="ignore"/> 
</set> 

Cette collection est pas paresseux. Cela peut être votre goulot d'étranglement.

Avez-vous besoin de toutes les informations? Vous pouvez lire les champs de votre entité avec Hibernate, si vous voulez seulement lire les ID.

+0

Oui, vous êtes ici. La suppression de cette relation résout le temps de requête lent. Merci de m'indiquer de cette façon! – onigunn

0

je dirais un coup d'oeil sur les journaux DB pour vérifier ce sont les instructions SQL exactes qui sont exécutées. Hibernate peut-être charger plus que la requête native que vous attendez, car il peut charger des collections impatientes, etc.

Activez donc la journalisation des requêtes Hibernate, ou mieux encore, vérifiez les journaux de DB pour voir ce qui est exécuté.