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 :

Temps de réponse pour count entre HQL et SQL Natif


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut Temps de réponse pour count entre HQL et SQL Natif
    Bonjour
    J'ai remarqué une différence de temps de réponse entre une requête count en HQL et en SQL sur Oracle. Le code de ma requête HQL est semblable à celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    Query hibernateQuery = this.getSession().createQuery("select count(*) from ...");
    long count = ((Long) hibernateQuery.uniqueResult()).longValue();
    Cette requête prend 5 secondes pour 3020 enregistrements comptés.

    Après avoir passé le paramètre hibernate.show_sql à true. J'ai exécuté la requête SQL générée, avec la méthode createSQLQuery. Celle-ci répond en moins d'une seconde. J'ai le fait le même test sur un client Oracle, j'observe le même temps de réponse.
    Quelqu'un peut m'expliquer cette différence de temps en HQL et SQL. Faut-il privilégier le SQL au lieu du HQL pour ce genre de requête ?
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    et si vous inversez l'ordre des deux requetes, l'avantage est toujours au même?
    et si vous faites plusieurs fois l'opération dans hibernate, le temps reste le même? Difficile de conclure à une règle général a partir d'une mesure particulière

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    En faisant plusieurs fois l'opération dans hibernate, le temps n'est pas le même. A la première éxécution, le temps de réponse est égal à 5 secondes, puis inférieur à 1 seconde. Je pense que cela vient du temps de calcul du plan d'exécution par le moteur SQL. Vu que dans ma requête il y a des jointures assez complexes, cela prend du temps

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ça ou vous avez inclus dans la mesure le démarrage d'hibernate, qui prend du temps.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Il y a d'autres requêtes avant la requête qui pour moi posait problème.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    attention qu'avant un select, hibernate fait un flush de ses données! ça pourrait jouer sur vos performances.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 23
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    attention qu'avant un select, hibernate fait un flush de ses données! ça pourrait jouer sur vos performances.
    C'est seulement dans le cas où on n'est pas dans la même session non ?

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    au contraire, pour que le résultat de la requete HQL (qui passe par la DB) soit correct, il faut que la DB corresponde à la session hibernate, donc la session, si elle a des modifications, va être flushée vers la DB pour la mettre à jour avant de faire la requete. Sinon on aurait ce genre de chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Personne p = new Personne("Tartempion");
    s.saveOrUpdate(p);
    List personnes = s.createQuery("from Personne").list();
    et magie, tartempion n'apparaitrais pas dans la liste de personnes, ce qui serait incohérent.

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est plutôt étonnant ce que tu dis là.
    Dans la mesure où on est dans la même session (donc Connection), le select voit l'ajout même s'il n'est pas "commité".
    Tu es sûr de ce que tu avances ?
    Pour moi, il est inconcevable qu'un flush soit fait avant un select, il doit attendre l'instruction explicite commit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. temps de réponse pour mise en forme graphe
    Par lalmimaj dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/12/2012, 17h05
  2. [Débutant] Problème de temps de réponse pour une recherche d'articles
    Par Tazze-99 dans le forum VB.NET
    Réponses: 22
    Dernier message: 14/12/2011, 10h50
  3. Temps d'exécution pour une procédure stockée PL/SQL Oracle 9
    Par strompakha dans le forum Administration
    Réponses: 3
    Dernier message: 18/05/2010, 14h09
  4. [MySQL] Temps de réponse tableau double entrée
    Par dam28800 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/08/2008, 08h38
  5. Réponses: 5
    Dernier message: 19/04/2007, 11h03

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