IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Performance requete hibernate


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut Performance requete hibernate
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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

  2. #2
    Membre confirmé
    Profil pro
    Développeur Java
    Inscrit en
    Juin 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2009
    Messages : 102
    Par défaut
    L'astuce consiste 90% du temps à ne charger que ce dont on a besoin. Hibernate est à double tranchant : facile d'utilisation mais il est tentant de se laisser emporter et ne plus maitriser entièrement ce que l'on fait.

    Moi, à ta place, je regarderais si dans mes objets "client" il n'y a pas des données membres qu'il n'est pas nécessaire de charger, au moins dans un premier temps. Si après en avoir récupérer 1M on n'en traite que 1000, il sera intéressant de ne charger entièrement que ces 1000 clients...

    Et si il faut tout charger, après tout, ça s'appelle un export de données, et ça c'est normal que ça prenne du temps...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Que fais tu des résultats que tu extrais ?

    Combien de temps prend la requête traduite en SQL quand tu l'exécutes directement dans ton SGBD ?

  4. #4
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Combien de temps prend la requête traduite en SQL quand tu l'exécutes directement dans ton SGBD ?
    Et même, combien de temps sur le serveur de BDD et depuis ta machine ? Attention au transfert au niveau réseau d'un gros volume de données.

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Merci pour vos reponses,

    La requête si on l'execute directement sur MySql (base locale) ça prend 2.7705 sec et elle recupere 82 212 enregistrements.

    Pour répondre à l'autre question, si je suis obligé de récupérer tout ces enregistrements.

    J'ai deux raisons pour cela :

    La premiére, je suis obligé dans la mesure où ces enregistrements sont affichés dans une table (constituée de n pages) et qu'il y a une option de recherche de type autocomplete qui permet de proposer des enregistrements en fonction de ce qui est tapé. Si javais pas cette option, j'aurai effectivement pu faire un chargement page par page.

    La deuxième qui est la plus importante, c'est pour des raisons de performance. Ces données sont chargés dans des hashTable, ce qui me permet de les updater en temps record, si j'avais à consulter la base à chaque fois pour effectuer cela, ça aurait était très très long, surtout pour le type d'application que je developpe, qui reçoit sans arret des notifications d'update et d'ajout à des intervalles en millisecondes.


    Par contre, j'ai remarqué que ce qui ralenti autant cette recherche c'était l'order by et surtout car je trier avec deux champs. J'ai remarqué aussi et j'ai trouvé bizar que la recuperation de 20.000 ce fait en moyenne en 10ms et que la récupération de 200.000 faisait en 14s. J'ai opté donc pour une grosse récupération à chaque fois, comme ça j'aurai moins de requête à effectuer.

    Donc pour l'instant, le chargement est un peu long, en moyenne de 15s à 16s pour récupérer environ 100.000 champs. Ca reste long mais un peu "acceptable". Je voudrais vraiment le réduire pour descendre au dessous de 5s

    Merci encore

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    D'après ce que tu nous dis, c'est surtout la quantité de données que tu extrais qui te donne ce temps de réponse si long.
    Tu as des contraintes, mais à mon avis, retourner autant de données n'est pas la bonne solution.
    Il vaut souvent mieux faire beaucoup de petites requêtes rapides qu'une grosse.
    A mon avis il faudra repenser la conception pour éviter de remonter tous ces enregistrements.

Discussions similaires

  1. [9i] Performance requete UPDATE + IN
    Par bob33 dans le forum Oracle
    Réponses: 12
    Dernier message: 26/10/2006, 15h22
  2. erreur requete hibernate
    Par rosros dans le forum Hibernate
    Réponses: 6
    Dernier message: 14/09/2006, 10h27
  3. [9i]Performance requete dlink
    Par mezoo dans le forum Oracle
    Réponses: 8
    Dernier message: 31/08/2006, 09h16
  4. pb sum dans requete hibernate
    Par clairette dans le forum Hibernate
    Réponses: 1
    Dernier message: 03/07/2006, 10h34
  5. Performance requete SQL
    Par billout9 dans le forum Oracle
    Réponses: 4
    Dernier message: 28/11/2005, 21h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo