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

DB2 Discussion :

Optimisation methode insertion


Sujet :

DB2

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut Optimisation methode insertion
    Bonjour tout le monde,

    Je cherche le moyen d'optimiser une méthode qui prend beaucoup de temps. cette methode consigne dans trois tables des données d'un objet Erreur

    voici la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public void Insert(Erreur E,String nom_fic) throws SQLException
    {
    	//int index = getFreeIndex();
    	String requete = "insert into TL_LOGMSG(DATLOGMSG,HMSLOGMSG,NOMCLA,LIBSEV,LIBMSG,NOMXCP,NOMFCH) values('"+E.Date+"','"+E.Time+"','"+Pars(E.Class)+"','"+E.Level+"','"+Pars(E.Intitule)+"','"+Pars(E.theException)+"','"+ nom_fic +"')";
    	//System.out.println(requete);
    	this.execute2(requete);
    	int id = getIndex();
    	if(E.Pile!=null || !E.Pile.isEmpty())
    	{
    		Iterator iter = E.Pile.iterator() ;
    				int i=0;
    				while (iter.hasNext()) 
    				{
    					i++;
    				this.execute2("insert into TL_LOGPILMTH(TK_LOGMSG,ODRPILMTH,PTHMTH)values("+id+","+i+",'"+Pars((String)iter.next())+"')");
    				}
    	}
    	if(E.Arg!=null || !E.Arg.isEmpty())
    	{
    		Iterator iter = E.Arg.iterator() ;
    				int i=0;
    				while (iter.hasNext()) 
    				{
    				String s = (String) iter.next();
    				String lib = s.substring(0,s.indexOf(":"));
    				String valeur = s.substring(s.indexOf(":")+1,s.length());	
    				requete = "insert into TL_LOGARG(TK_LOGMSG,LIBARG,VALARG)values("+id+",'"+Pars(lib)+"','"+Pars(valeur)+"')";
    				this.execute2(requete);
    				}
    	}	
    }
    voici comment sont construites mes tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    create table TL_LOGMSG(
    TK_LOGMSG INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 0, INCREMENT BY 1, NO CACHE ),
    DATLOGMSG varchar(11),
    HMSLOGMSG varchar(13),
    NOMCLA varchar(100),
    LIBSEV varchar(30),
    LIBMSG varchar(400),
    NOMXCP varchar(600),
    NOMFCH varchar(256));
     
    create table TL_LOGARG(
    TK_LOGMSG INTEGER,
    LIBARG varchar(100),
    VALARG varchar(100));
     
    create table TL_LOGPILMTH(
    TK_LOGMSG INTEGER,
    ODRPILMTH Integer,
    PTHMTH varchar(700));
    Donc voila je me demandais si par exemple il serai plus judicieux et possible de faire une seule et unique requete.
    Aussi si je devrais revoir mes tables, la façon dont elles sont construites.

    Sinon je sais que je ne suis pas dans le forum approprié mais ca m'aidera aussi : pensez vous que l'algorythme ( JAVA ) est correct ? Est il possible de faire plus concis et rapide ?

    Merci

  2. #2
    Membre éclairé Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Je précise que je travaille sur DB2...

  3. #3
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Bonjour,

    Pour la partie strictement DB2 :

    Où sont passées les clés primaires ?
    Où sont les index ?
    Avez-vous exécutés les Réorganisations ? Les Runstats ? Les Rebind à suivre ?
    Avez-vous analysé les Explain ?
    Quelles sont les volumétries ?
    Avez-vous vérifié dans le catalogue que les espaces physiques sont taillés de façon pertinente ?
    S’agit-il de DB2 pour z/OS ou autre ?
    Etc.

    Si vous avez des problèmes de performance, vous devez être à même de déterminer si c’est la partie SQL qui est en cause et/ou les programmes qui hébergent les requêtes. Les requêtes doivent donc être testées hors programme et si vous avez des outils de mesure, n’hésitez pas à en vous en servir.

  4. #4
    Membre éclairé Avatar de keub51
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Bonjour,

    Pour la partie strictement DB2 :

    Où sont passées les clés primaires ?
    Où sont les index ?
    Avez-vous exécutés les Réorganisations ? Les Runstats ? Les Rebind à suivre ?
    Avez-vous analysé les Explain ?
    Quelles sont les volumétries ?
    Avez-vous vérifié dans le catalogue que les espaces physiques sont taillés de façon pertinente ?
    S’agit-il de DB2 pour z/OS ou autre ?
    Etc.

    Si vous avez des problèmes de performance, vous devez être à même de déterminer si c’est la partie SQL qui est en cause et/ou les programmes qui hébergent les requêtes. Les requêtes doivent donc être testées hors programme et si vous avez des outils de mesure, n’hésitez pas à en vous en servir.

    en ce qui concerne les clés primaires, leur utilisation m'a été déconseillée par un administrateur ... allez savoir pourquoi ...

    les index sont les premieres colonnes de chaque table

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Avez-vous exécutés les Réorganisations ? Les Runstats ? Les Rebind à suivre ?
    Avez-vous analysé les Explain ?
    Quelles sont les volumétries ?
    Avez-vous vérifié dans le catalogue que les espaces physiques sont taillés de façon pertinente ?
    S’agit-il de DB2 pour z/OS ou autre ?
    sur ca je suis incapable de te répondre trop technique a mon goût

    Je pense que les partie SQL/Programme ont toutes les deux besoin d'être optimisées ... Je m'explique : j'ai fait cette méthodes avec des connaissances de base, il y a surement des objets qui correspondent mieux ( je pense à preparedstatement au quel je vais jeter un oeil ... ). De plus la base de données que j'utilise est assez solicitée ...

    Merci de vos réponses en tout cas je vais regarder ca en ce beau lundi matin

  5. #5
    Membre chevronné Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Par défaut
    exemple prepareStatement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    PreparedStatement pstmt = null;
    String sql = "insert into matable (zone1, zone2, zone3) values (?, ?, ?) " ;
    try { 
       pstmt = conn.prepareStatement(sql);
       pstmt.setString(1, "valZone1" );
       pstmt.setInt(2, 25); // en supposant que zone2 soit un champ integer
       pstmt.setString(3, "valZone3" );
       pstmt.executeUpdate();
    }
    catch(SQLException sqle) {
    // ... 
    }
    la meme chose dans le cas d'insert massif (cela doit etre le cas dans ton Iteration )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    PreparedStatement pstmt = null;
    String sql = "insert into matable (zone1, zone2, zone3) values (?, ?, ?) " ;
    try { 
       pstmt = conn.prepareStatement(sql);
       for (int i= 0; i < 1050 ; i++) {
           pstmt.setString(1, "valZone" );
           pstmt.setInt(2, i); // en supposant que zone2 soit un champ integer
           pstmt.setString(3, "valZone3" );
           pstmt.addBatch();
           // commit toutes les 100 insertions
           if ((i % 100) == 0) {
    	  pstmt.executeBatch();
              conn.commit() ;
            }
       }
       // traitement des 50 dernieres lignes
       pstmt.executeBatch();
       conn.commit() ;
     
    }
    catch(SQLException sqle) {
    // ... 
    }
    De plus au niveau sql il est preferable d'utiliser des champs date ou timestamp au lieu de varchar si c'est des dates/heures que tu traites.

  6. #6
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 218
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par keub51
    en ce qui concerne les clés primaires, leur utilisation m'a été déconseillée par un administrateur ... allez savoir pourquoi ...
    Il serait intéressant que votre administrateur expose ses motifs...
    En attendant, vos tables ne sont pas des ensembles, mais des sacs : l’algèbre relationnelle ne s’applique pas. L’intégrité référentielle n’est pas contrôlée. Vous vous servez de votre SGBDR comme d’un SGBD non R. Le contenu de la base de données n’est peut-être pas très beau à voir.


    Citation Envoyé par keub51
    les index sont les premieres colonnes de chaque table
    C’est original, mais ça ne relève pas d’une étude sérieuse des besoins des applications...


    Citation Envoyé par keub51
    Code :
    Avez-vous exécutés les Réorganisations ? Les Runstats ? Les Rebind à suivre ?
    Avez-vous analysé les EXPLAIN ?
    Quelles sont les volumétries ?
    Avez-vous vérifié dans le catalogue que les espaces physiques sont taillés de façon pertinente ?
    S’agit-il de DB2 pour z/OS ou autre ?

    sur ca je suis incapable de te répondre trop technique a mon goût
    Et l’administrateur fait-il ce travail ?
    A défaut, la base de données ne peut être qu’une brouette alors qu’elle pourrait être une Ferrari...

  7. #7
    Membre chevronné Avatar de rberthou
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 612
    Par défaut
    Au niveau du code java il est déjà bien préférable d'utiliser :
    - prepareStatement : mais cela risque de modifier ton code.
    - des batchUpdate : dans le cas ou tu boucle sur les insertions (avec bien sur des prepareStatement)

    Tu peux également regarder du cote de sqlj (si tu es sur DB2) pour en pas faire de sql dynamique (mais personnellement j'aime pas beaucoup sqlj)

Discussions similaires

  1. [MySQL] methode optimisée d'insertion de données
    Par redoran dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 04/04/2012, 11h35
  2. optimisation d'insert de données
    Par barabas123 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 28/08/2007, 16h19
  3. Réponses: 4
    Dernier message: 09/07/2007, 12h03
  4. optimisation requete insert ou update sous postgres
    Par peppena dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/03/2007, 11h21
  5. Optimiser un INSERT global
    Par niiccoo dans le forum Oracle
    Réponses: 25
    Dernier message: 22/05/2006, 14h25

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