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 :

ORACLE Ecrire resultats meilleur maniere


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 106
    Points
    106
    Par défaut ORACLE Ecrire resultats meilleur maniere
    Bonjour,

    Contexte:
    Appli C++
    En gros le programme fait:

    Pour chaque element dans Contener1
    Res = Calcule(parametres venant de elements);
    ecritRES(RES); //ecrit les resultats dans la DB

    Donc une appli basique.

    Infos et volumetrie:
    - On a a peut pres 2 millions de resultats a ecrire (=nb element de contener1)
    - Les resultats correspondent a 10 champs que l on ecrit dans une seule table.
    - On passe plus de temps a ecrire les resultats que a Calculer


    Questions
    Quelle est la maniere la plus efficace de faire cela ?
    Utiliser un insert multi values, utiliser sqlbulkoperations, utiliser un buffer de resultats et tout ecrire d un coup ou autre .
    Vu que je ne suis pas un expert, toute suggestion est bien venue.

  2. #2
    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
    Les données du conteneur 1 provient d'où ?
    Les calculs peuvent se faire en SQL ?

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Points : 106
    Points
    106
    Par défaut
    Les donnees de contener1 viennent de la base de donnee
    Les calcules de peuvent pas se faire en SQL

    On est dans un cas typique de :
    - LoadData() from DB --> Build Contener1
    - For each elmt in Contener1
    -
    • RES = Calcule()
    • WriteSingleResult(RES) in DB

    Ou on peut faire :
    - LoadData() from DB --> Build Contener1
    - For each elmt in Contener1
    -
    • RES = Calcule() --> build vectorResult

    - WriteAllResult(vectorResult) in DB


    Le truc c est que l on a 2 millions de resultats a ecrire.
    Je souhaiterais donc savoir la maniere la plus efficace pour le faire.
    Parceque un petit gain de temps multiplie par 2 millions ca commence a faire.

  4. #4
    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
    Les meilleurs solutions sont:
    • si c'est possible utiliser que du SQL, éventuellement en parallèle, [EDIT]éventuellement en mode nologging [/EDIT]
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      insert into table2 select col1, col2, f_SQL_simple (col1, col2) res from table 1
    • en PL/SQL via les fonctions pipelined éventuellement en parallèle si les calculs sont plus complexes
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      insert into table2 select col1, col2, col3_res from table(f_pipe(param))
    • en autre langage en travaillant en tableau et non pas ligne par ligne. Attention, parsez une seule fois, utilisez de variables de liaison (bind variable).

  5. #5
    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
    J'avais lu à travers votre réponse. Dans aucun cas il n'est pas envisageable de stocker et écrire 2 millions d'enregistrements d'un seul coup.

    Cella se fait par tranches de 1000 à 5000 enregistrements il faut tester pour trouver l'optimum.
    Donc:

    Tant qu'il y a des enregistrements à lire
    • lecture d'un paquet de 1000 enregistrements dans le conteneur 1
    • calcule des valeurs
    • écriture de 1000 enregistrements


    Mais, cette méthode est encore très loin derrière les autres.

    Jetez aussi un œil sur Making Database Friends

Discussions similaires

  1. postgis select la meilleur maniere
    Par nine dans le forum Extensions
    Réponses: 2
    Dernier message: 03/06/2009, 13h09
  2. Réponses: 47
    Dernier message: 10/04/2008, 03h27
  3. Quelle est la meilleure maniere de faire une count?
    Par farenheiit dans le forum Administration
    Réponses: 20
    Dernier message: 16/11/2007, 16h45
  4. [XSLTRANSFORM][c#] ecrire resultat dans un fichier
    Par fredo_lefran dans le forum C#
    Réponses: 1
    Dernier message: 26/10/2006, 11h46
  5. Oracle 8.1.7.4 interpration resultat tkprof
    Par ducho dans le forum Oracle
    Réponses: 30
    Dernier message: 28/04/2005, 15h27

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