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

JDBC Java Discussion :

performances de rs.next()


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut performances de rs.next()
    Bonjour,

    En essayant d'optimiser mon appli j'ai mis en place un pooling sur l'interrogation d'une vue. Le but était de traiter un grand nombre de données par petits lots en pensant que ça irait plus vite et prendrait moins de mémoire.

    Donc j'ai une requête de sélection (read only) sur une vue.
    Quelque soit le nombre d'enregistrement la requête prend à peu près le même temps : 1 à 2s.
    Par contre une fois la requête effectuée et le resultset obtenu je fais les resultset.next()... et c'est là que ça devient étrange :

    moins il y a de tuple dans mon resultset plus le premier resultset.next est long !?!

    exemple : il y a 1511 enregistrements dans ma vue
    ---------------------------+---------------------+----------------------
    nombre d'enregistements.....| durée d'exécution.....| durée d'exécution
    demandé parmis les 1511.....| de la requête...........| du 1er resultset.next
    ---------------------------+---------------------+----------------------
    TOUS...............................|.................1031 ms |..................7631 ms
    ---------------------------+---------------------+----------------------
    500.................................|...................711 ms |..................7540 ms
    ---------------------------+---------------------+----------------------
    100.................................|...................601 ms |.................50493 ms
    ---------------------------+---------------------+----------------------
    50...................................|...................611 ms |.................48900 ms
    ---------------------------+---------------------+----------------------

    quelqu'un peut-il m'expliquer cela ?


    JAVA 1.4
    Base de donnée : SQL Server 2000 (vue sur une base liée : DB2)
    Driver : net.sourceforge.jtds.jdbc.Driver

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Peux-tu mettre le code de ton traitement ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    voici un bout du code, bien qu'il n'y ai rien de particulier je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    stmt = conn.createStatement();
    stmt.setQueryTimeout(timeout*60*1000); // 12 mn
    long start = System.currentTimeMillis();
    rset = stmt.executeQuery(query);
    System.out.println("createStatement " + (System.currentTimeMillis() - start));
    start = System.currentTimeMillis();
    while (!suspend && rset.next()) {
         System.out.println("rset.next() " + (System.currentTimeMillis() - start));
         ref = rset.getString("ref");
         ...
    }

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _Eric_ Voir le message
    ... bien qu'il n'y ai rien de particulier je pense :
    C'est le moins qu'on puisse dire... mais je voulais être sûr que tu n'utilises pas de fonctionalités particulières des statements.

    Le tableau de temps que tu as donné correspond à la lecture :
    1- de tous les enregistrements
    2- des 500 premiers enregistrements
    3- des 100 premiers enregistrements
    4- des 50 premiers enregistrements

    ou faut-il comprendre :
    1- idem
    2- renvoi d'un bloc de 500 enregistrements (autres que les 500 premiers)
    etc...

    Je le demande parce que ça expliquerait le temps croissant (puisqu'il faudrait bien lire les enregistrements des blocs déjà lus)

    Je suis clair ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    il s'agit toujours des permiers enregistrement,
    j'ai redémarré completement l'application entre chaque test

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    et j'ai fais les tests plusieurs fois, avec des temps similaires dans chaque cas

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Alors là, c'est surprenant...
    Dans ta boucle tu incrémentes un compteur et tu le testes, c'est bien ça ?
    (ou tu utilises un setMaxRows(500)... )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    en fait la clause where de la requête est créé dynamiquement et ressemble à ça :

    SELECT ... FROM ma_vue WHERE ref = 'x1' OR ref = 'x2' OR ...

    avec autant de "ref = 'xn' OR" que de résultat attendu (tous, 1000 ou 500...).
    ça peu sembler un peu lourd mais ça répond à mes contraintes de selection et le temps d'exécution de la requête me convient.
    Mais je ne comprend ce délais pour le premier .next

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ca veut dire que plus tu en demandes (hors tous), plus tu as de OR et ça met plus de temps ???

    Peux-tu faire le test avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ref in ('x1', 'x2',..., 'xn')
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    je vais essayer mais il me semblait que c'est la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stmt.executeQuery(query);
    qui devrait être impactée par le temps de traitement de la requête.
    le rset.next() ne fait que positionner le curseur sur le premier résultat non ?
    A moins que le tableau de résultat ne soit effectivement créé qu'au premier next...?

    Ca veut dire que plus tu en demandes (hors tous), plus tu as de OR et ça met plus de temps ???
    non c'est le contraire
    Et même lorsque je les demande tous j'ai toutes les references dans la clause where soit 1511 fois "ref='x' OR..." et ça va beaucoup plus vite que seulement 50 fois "ref='x' OR..."

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Oui je crois bien que c'est lors du premier next() qu'il va "lancer" la requête (physiquement) mais il fait déjà un contrôle lors de l'executeQuery (peut-être que syntaxique), dans tous les cas, ça risque fort de dépendre de ton driver JDBC...

    Donc, moins tu en demandes, plus tu as de OR (on est d'accord) ?
    Là, je comprends pourquoi ça met plus de temps...

    Peux-tu en dire plus sur cette requête ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    non c'est le contraire...

    si je n'en veux qu'un seul (x1 par exemple) :
    SELECT * FROM ma_vue WHERE ref = 'x1'

    si j'en veux 10, je connais les 10 references (exemple : x1, x2, ..., x10) :
    SELECT * FROM ma_vue WHERE ref = 'x1' OR ref = 'x2' [...] OR ref = 'X10'

    Dans tous les cas je connais les références des tuples dont j'ai besoin.

    en résumé :
    - moins j'en demande, moins j'ai de paramêtre dans la clause WHERE et plus ça prend de temps
    - plus j'en demande, plus j'ai de paramêtre dans la clause WHERE et moins ça prend de temps

  13. #13
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    et si tu l'exécutes directement en SQL c'est la même observation ? Moins t'as de OR plus c'est long ?

    quand tu dis que tu charge tout et que ça va plus vite, t'as pas un OR par ligne quand même ?

    si oui, quel est le temps d'exécution de la requête SELECT * FROM mavue ?

    sinon essaie de jouer sur les propriétés de ton statement en mettant par exemple en read-only, not scrollable ... Comme c'est sûr une vue, peut être que ça peut améliorer les choses ...
    "If email had been around before the telephone was invented, people would have said, 'Hey, forget email! With this new telephone invention I can actually talk to people!"

    Besoin d'une nouvelle méthode pour développer ? -> http://www.la-rache.com/

  14. #14
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    et si tu l'exécutes directement en SQL c'est la même observation ? Moins t'as de OR plus c'est long ?
    pour l'instant la base distante est indisponible, je testerai en sql lundi.

    quand tu dis que tu charge tout et que ça va plus vite, t'as pas un OR par ligne quand même ?
    si : [...] where ref='x1' OR ref = 'x2' ... OR ref = 'X1511'
    c'est assez monstrueux mais ce cas où je demande tout n'est utilisé que pour les tests, en fonctionnement normal il y a en moyenne moins d'une dizaine d'enregistrement sélectionnés.
    Et c'est parceque j'avais des temps de réponse pas terrible que j'ai élargit la requête à tous les enregistrements et que j'ai vu que ça allait mieux dans ce cas...

    Concernant le statement il est créé avec les option par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stmt = conn.createStatement();
    donc normalement TYPE_FORWARD_ONLY et CONCUR_READ_ONLY

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par _Eric_ Voir le message
    non c'est le contraire...
    bon, on est sur la même longueur d'onde... désolé...

    Quand tu dis "select * from ma_vue", c'est d'une vue que tu parles ou d'une table ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    une vue

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Serait-il possible d'avoir la définition de la vue ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    je n'ai pas la définition exacte de la vue, elle est fournie par une autre application.
    Par contre cette vue est sur un environnement DB2.


    pour répondre à "in" je vais faire le test en sql directement

  19. #19
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    en exécutant les requêtes via "query analyser" de sql server le résultat semble "normal" donc contraire à ce que j'obtient en java :

    pour 100 lignes : 14 sec
    pour 500 lignes : 45 sec
    plus il y a d'enregistrement et plus c'est long.

    en exécutant les requêtes sous dos via l'interpreteur de commande DB2, c'est quasiment instantané quelque soit le nombre d'enregistrement demandé.

    C'est vraiment dans le code java et en particulier lors du permier rset.next que c'est étrange.
    Peut-être le driver ?

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Tu utilises quel driver ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [maintenance][performance] Que faire comme maintenance ?
    Par woodwai dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/11/2003, 15h39
  2. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18
  3. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37
  4. Next & Previous
    Par bidson dans le forum XMLRAD
    Réponses: 13
    Dernier message: 01/05/2003, 09h35
  5. performance entre 3DS, ase, asc ...
    Par amaury pouly dans le forum OpenGL
    Réponses: 3
    Dernier message: 24/03/2003, 11h41

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