-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: Performance requete hibernate
PostPosted: Fri Jun 05, 2009 4:32 am 
Newbie

Joined: Fri Jun 05, 2009 4:21 am
Posts: 5
bonjour,

Je dois recuperer des données d'une table assez grande qui peut contenir quelques millions d'enregistrements (la table contient actuellement environ 250.000).

Pour améliorer les performances de cette récuperation, j'ai rajouté les champs figurant dans le where comme indexes et j'ai procédé à une récupération par bloc

Je récupére environ 20.000 enregistrements à chaque requête.

Chaque requete prend environ 10s en moyenne, je dois absolument arriver à améliorer ça !!! Car si je dois récupérer 1.000.000 d'enregistrements cela prend pas mal de temps comme meme, car je recupere à chaque fois que 20.000 enregistrements, imaginez 10s* 1.000.000/20.000, si je me suis pas trompé ds mon calcul ca fait presque 500ms !!!! ce qui énorme je pense.

Ce qui le faut savoir par rapport à mon environement :

Environement de dev normal avec 2GO en mémoire super utilisé par plein de programmes.

J'utilise mysql, oui je suis daccord que c'est pas le meilleur choix pour les "grosses bases" mais c'est soit lui soit postgres, a priori postgres est meilleur en perf mais j'ai pas trouvé de benchmarks exacte qui parle de ça.

Le programme est lancé depuis Eclipse et c'est executé dans le coontexte d'une application web JSF

et enfin voila ma requete

Code:
request = from XXXX where  (clientid= 'XXX' or clientid = 'YYY' or clientid = 'ZZZ') order by clientid,timecreation DESC 
Query query = session.createQuery(request);
query.setFirstResult(firstIndex);
query.setMaxResults(maxResult);
List<XObjet> tmp = query.list();

voila je pense que vous avez tout

Pourriez vous m'aider à améliorer cela,

Merci pour vos retours


Top
 Profile  
 
 Post subject: Re: Performance requete hibernate
PostPosted: Fri Jun 05, 2009 5:42 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
salut,
10s par requete c'est enorme.
Plusieurs pistes:
1- tu penses executer une seule requetes mais derriere, d'autres requetes sont lancées, --> N+1 problem. Active les logs SQL et vérifie qu'il n'y a bien qu'une seule requete SQL loggée.
2- 20000 objects à instancier c'est déjà par mal, essaie de passer ton parametre a 1000
3- n'oublie pas de libérer ta session a chaque execution de requete. Ca ne sert a rien de garder toutes ces entités attachées.

Bon courage,
Anthony

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Performance requete hibernate
PostPosted: Fri Jun 05, 2009 8:34 am 
Newbie

Joined: Fri Jun 05, 2009 4:21 am
Posts: 5
merci pour ton retour

Alors j'ai activé les logs d'hibernate, je ne vois rien d'anormal. C'est presque la même requête avec bq de as c'est tout

J'ai essayé de récupérer que 2000 par 2000 même ça prend 5s en moyenne à chaque fois, ce qui plus coûteux que de recuperer 10.000 sur 10s

sinon pour la libération de la session, je me contente de la fermer dans un bloc finally ca doit la liberer en principe ?

Donc le temps de réponse de mes requetes reste très long. pour les indexes, j'ai rajouté tous les champs qui figurent dans mes differentes clauses where, cad 6 indexes, dois je améliorer l'indexation ? comment ?

Merci bien


Top
 Profile  
 
 Post subject: Re: Performance requete hibernate
PostPosted: Fri Jun 05, 2009 8:41 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
Quote:
C'est presque la même requête avec bq de as c'est tout

attention ça peut justement être révélateur d'un problème.
Pose un point d'arret a l'execution de ta requete et scrute les logs.
Continue pas a pas jusqu'a ton bloc finally --> tu ne devrais avoir qu'une requete qui s'affiche, si tu en as des tonnes pour une seule page, tu as un probleme!

Quote:
sinon pour la libération de la session, je me contente de la fermer dans un bloc finally ca doit la liberer en principe

il faut que tu liberes la session a chaque execution de ta requete, je peux pas te dire si c'est bon puisque je e vois pas ton code.

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject: Re: Performance requete hibernate
PostPosted: Fri Jun 05, 2009 9:23 am 
Newbie

Joined: Fri Jun 05, 2009 4:21 am
Posts: 5
Merci pour votre retour rapide

alors voila en bref le code executé par chaque requete

Code:
Session session = SessionFactoryUtils.getSession(this.getSessionFactory(), true);
try
{
   session.setFlushMode(FlushMode.COMMIT);

   Query query = session.createQuery(request);
   query.setFirstResult(firstIndex);
   query.setMaxResults(maxResult);
   result.addAll(query.list());

}
finally
{
   session.close();
}


Sinon pour les logs j'ai encore reverifié il y a toujours une seule requete generée par hibernate par query.list(). C'est une requête normale avec un renomage de colonnes d'ou le as et une clause where
voila un exemple
Code:
Hibernate: select obmorder0_.id as order1_34_,
obmorder0_.tableid as order2_34_,
obmorder0_.size as order3_34_,
obmorder0_.execqty as order4_34_,
obmorder0_.avgprice as order5_34_,
obmorder0_.isin as order6_34_,
obmorder0_.exchange as order7_34_,
obmorder0_.owner as order8_34_,
obmorder0_.clientid as order9_34_,
obmorder0_.brokerid as order10_34_,
obmorder0_.side as order11_34_,
obmorder0_.instr as order12_34_,
obmorder0_.parentorderid as order13_34_,
obmorder0_.timecreation as order14_34_,
obmorder0_.timelastexec as order15_34_,
obmorder0_.currency as order16_34_,
obmorder0_.datefin as order17_34_,
obmorder0_.executionstate as order18_34_,
obmorder0_.fund as order19_34_,
obmorder0_.traqle as order20_34_,
obmorder0_.status as order21_34_,
obmorder0_.listorderid as order22_34_,
obmorder0_.clorderid as order23_34_,
obmorder0_.type as order24_34_,
obmorder0_.tif as order25_34_,
obmorder0_.limiteprice as order26_34_,
obmorder0_.securitydesc as order27_34_,
obmorder0_.odisysName as order28_34_ from obm_orders obmorder0_ where clientid='Group - Paris' or clientid='gg@test.com' or clientid='GGG' order by clientid, timecreation DESC limit ?, ?


Merci encore


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.