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

Oracle Discussion :

Date par défaut ou donnée dans la requête


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut Date par défaut ou donnée dans la requête
    Bonjour,

    Je programme un algorithme Java / JDBC qui va insérer un gros volume de données (plusieurs millions) dans une table Oracle.

    Cette table possède une colonne date qui n'est pas nullable et qui a une valeur par défaut sysdate.

    Ma question est de savoir s'il est plus performant et rapide de :
    • ne pas spécifier la date dans la requête INSERT et laisser Oracle donner la valeur par défaut à chaque insert

    • Obtenir la date côté Java avant ma boucle et fournir cette date à tous les insert.


    Dans le premier cas je me dis que moins de données transitent entre Java et Oracle (la date n'est pas donnée) mais Oracle devra calculer sysdate à chaque insert.

    Dans le deuxième cas, Oracle n'aura pas à calculer sysdate puisque je fournis la date, mais plus de données transitent entre Java et Oracle.

    Selon vous quelle est la solution la plus performante ?

    Merci d'avance

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    A vue de nez, je dirais de laisser la date par défaut automatique. Mais ce n'est pas une certitude, je suis curieux de connaître la réponse.

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Bref, faite un test. Mais est-ce que ça compte vraiment par rapport aux autres pièges qui guettent quelque part ? Comment faite vous vos inserts ? Pourriez-vous poster une version simplifiée du votre code ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    un test rapide avec :

    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
    CREATE TABLE TEST 
       (	A DATE DEFAULT sysdate
       )
     
     
    begin
    for x in 1..50000 loop
    insert into test values (TO_DATE('2005-10-08 11:29:11', 'RRRR-MM-DD HH24:MI:SS')) ;
    end loop;
    commit;
    end;
    /
     
    begin
    for x in 1..50000 loop
    insert into test values (null );
    end loop;
    commit;
    end;
    /
    montre que sur ma bd 10gXE, le passage d'un null est 30% plus rapide qu'un passage de valeur...

    Mais comme dit mnitu, ce n'est pas ici que se fera la grosse différence au final...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    Je ne fais rien de très compliqué. Juste une boucle qui insère. J'utilise le JdbcTemplate du framework Spring. Pour vous éclairer voici en gros les deux codes antre lesquels j'hésite.

    La date n'est pas donnée et est calculée par Oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    List<String[]> totos = ... // une ArrayList de tableau de String à deux entrées avec des millions d éléments
    // pas de date
    for(String[] toto : totos){
      saveMaLigne(toto[0],toto[1]);
    }
     
    public void saveMaLigne(String col1Value, String col2Value) {
      Long id = jdbcTemplate.queryForLong("select maSequence.nextVal from dual");
      jdbcTemplate.update("insert into matable (id, col1, col2) values (?,?,?)", new Object[] { id, col1Value, col2Value });
    }

    La date est fixée au début de la boucle et est donnée aux inserts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    List<String[]> totos = ... // une ArrayList de tableau de String à deux entrées avec des millions d éléments
    java.util.Date date = new java.util.Date();// Date fixée au début de la boucle et donnée aux inserts
    for(String[] toto : totos){
      saveMaLigne(toto[0],toto[1],date);
    }
     
    public void saveMaLigne(String col1Value, String col2Value, java.util.Date date) {
      Long id = jdbcTemplate.queryForLong("select maSequence.nextVal from dual");
      jdbcTemplate.update("insert into matable (id, col1, col2, colDate) values (?,?,?,?)", new Object[] { id, col1Value, col2Value, date });
    }

    Quels sont ces "pièges" dont vous parlez ?
    Suis-je condamner à faire un petit benchmark artisanal ?

    Merci pour vos réponses.

    P.S. : Pourquoi ce site me formate mes for en FOR et mes update en UPDATE ?

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Avec 500.000 enregistrements, j'arrive au même temps. Ce n'est pas là qu'il faudra optimiser l'insertion.

    NB: Oracle 9.2.0.7

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par El Saigneur Voir le message
    ...
    Quels sont ces "pièges" dont vous parlez ?
    Suis-je condamner à faire un petit benchmark artisanal ?

    Merci pour vos réponses.

    P.S. : Pourquoi ce site me formate mes for en FOR et mes update en UPDATE ?
    Le piège habituel et le plus grave, qui guettent les programmeurs Java consiste à ne pas utiliser les variables de liaison dans les requêtes envoyées vers le serveur mais, ce n'est pas votre cas!
    Par contre je pense que vous pouvez améliorer votre traitement en supprimant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    selectfrom dual
    de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into ma_table (id, col1, col2) values (masequence.nextval, ?, ?) ...
    Et encore, il a bien plus de gain en terme de performance si vous arrivez à insérer par lot et non pas enregistrement par enregistrement.
    For Developers: Making Friends with the Oracle Database.


    PS. peut être parce que vous est sur le forum SQL (PL/SQL)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Points : 68
    Points
    68
    Par défaut
    Merci mnitu pour ces conseils. Je vais effectivement incorporer ma recherche de séquence dans la requête INSERT elle même. Je ne savais pas qu'on pouvait faire ça et ça économise un aller-retour à la base à chaque boucle. C'est cool.

    D'autre part, je vais lire l'article vers lequel vous me renvoyez pour apprendre cette technique d'insert en bloc.

    Merci encore pour ces infos.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Date par défaut dans un TextBox en Vba
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2009, 08h10
  2. Réponses: 2
    Dernier message: 03/12/2007, 14h47
  3. Date par défaut dans formulaire
    Par papagei2 dans le forum IHM
    Réponses: 11
    Dernier message: 07/11/2007, 06h21
  4. Désactiver la date par défaut dans un DateTimePicker
    Par Gaetch dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/07/2007, 15h43
  5. [DATE]date par défaut dans un champ
    Par fabszn dans le forum DB2
    Réponses: 2
    Dernier message: 20/10/2006, 09h05

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