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

PL/SQL Oracle Discussion :

Performances d'insertion dans une procédure


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Par défaut Performances d'insertion dans une procédure
    Bonjour,

    je suis en pleine rédaction de ma première vraie procédure PL/SQL, dont le but est d'insérer dans une table tierce, à partir d'une table lignes de commandes, des données de quantité commandée, expédiée, reste à expédier... calculs effectués à partir d'une autre table.
    Donc je récupère les lignes de commandes concernées via un curseur, et dans l'exécution de ce curseur, je calcule les positions citées ci dessus, que je stocke dans des variables, tant que le curseur ramène des lignes.

    Ma question est de savoir quelle est la solution performante entre effectuer un insert des valeurs A, B, C, D à chaque passage dans la boucle, ou bien gérer un tableau de type RECORD alimenté à chaque passage, puis ne faire qu'une insertion à la fin du traitement du curseur?

    J'ai effectué des recherches dans la FAQ et sur le forums PL/SQL, je n'ai pas trouvé d'éléments pertinents. Etant novice dans la création PL/SQL, je crains que certains termes que j'utilise soient inappropriés, aussi n'hésitez pas à pointer mes erreurs sémantiques

    je vous remercie par avance de l'aide que vous pourrez m'apporter.

    Cordialement,

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut,

    Effectivement faire des traitements de masse c'est beaucoup plus performant que les insert ligne à ligne cf tuto

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Par défaut
    merci skuatamad,

    je pense effectivement que c'est le genre de comparaison que je n'arrivais pas à trouver. Il me reste à comprendre le fonctionnement

    Merci en tous cas de ton aide,

    Cordialement

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Il faut toujours garder à l'esprit que l'accès au disque dur est au moins 100 fois plus coûteux que l'accès à la mémoire vive, donc l'accès à une table est au moins 100 fois plus coûteux que l'accès à une variable mémoire.
    D'où l'intérêt de faire les algos lourds en manipulant des tableaux, puis de faire un INSERT final, qui au passage peut gagner en performance en l'utilisant avec un FORALL (documenté dans le tutoriel PL/SQL du site).

  5. #5
    Expert confirmé 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
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    Il faut toujours garder à l'esprit que l'accès au disque dur est au moins 100 fois plus coûteux que l'accès à la mémoire vive, donc l'accès à une table est au moins 100 fois plus coûteux que l'accès à une variable mémoire.
    D'où l'intérêt de faire les algos lourds en manipulant des tableaux, puis de faire un INSERT final, qui au passage peut gagner en performance en l'utilisant avec un FORALL (documenté dans le tutoriel PL/SQL du site).
    Désolé, mais ce n'est pas une histoire d'accès au disque!
    Au départ les données sont toujours sur le disque! La lecture ligne à ligne n'implique pas un accès au disque à chaque fetch! Etc.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Désolé, mais ce n'est pas une histoire d'accès au disque!
    Au départ les données sont toujours sur le disque! La lecture ligne à ligne n'implique pas un accès au disque à chaque fetch! Etc.
    Bonjour,

    effectivement, la lecture ne me pose pas vraiment de problème, il s'agit en fait de l'insertion de données dans une autre table (données provenant de la lecture d'une table) qui me fait poser des questions: je vois deux façons de faire mon algo, soit en insérant ligne à ligne à chaque fetch, soit en gérant un tableau de records, qui fait l'insertion une fois toutes les lignes traitées et le fetch terminé.

    Je vais donc a priori me tourner vers FORALL, avec tout de même une petite précision (pour être sûr): le fait de gérer le commit après mon forall effectuera bien un seul accès disque ?

    d'avance merci

    Cordialement

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Au départ les données sont toujours sur le disque! La lecture ligne à ligne n'implique pas un accès au disque à chaque fetch! Etc.
    Est-ce que j'ai dit que chaque fetch implique un accès disque ???
    Toujours est-il, par contre, qu'il implique un accès disque tous les N fetch, ce qui justifie de passer par des variables mémoires. Je donnais une tendance pour que f-demu01 ait une idée du fonctionnement. Maitenant si tu as la science suffisante pour nous donner la valeur du N en fonction des différents paramètres à prendre en compte, libre à toi de disserter...
    Au passage, pourrais-tu aussi nous expliquer l'intérêt du BULK COLLECT si le FETCH n'est pas gourmand en accès disque.
    Pour f-demu01, le BULK COLLECT est le pendant du FORALL, mais quand tu "balances" les données dans les variables.

    Citation Envoyé par mnitu Voir le message
    Désolé, mais ce n'est pas une histoire d'accès au disque!
    Donc je suis désolé, mais je maintiens que c'est une histoire d'accès au disque!

    Citation Envoyé par mnitu Voir le message
    Quand c'est possible la solution la plus performante est

    Code :

    INSERT INTO TABLE
    SELECT ... FROM T1, T2 etc.
    Parfois cette solution peut être mise en pratique en utilisant les fonctions pipelined.
    Certes, mais si tu lis le post initial de f-demu01, tout laisse à penser que son algo est fonctionnellement trop compliqué pour être résolu en ensembliste.

    Citation Envoyé par f-demu01 Voir le message
    Bonjour dgi77,

    j'ai imprimé, lu et testé le cours de SheikYerbouti concernant l'utilisation des collections et de FORALL. A plusieurs reprises, il est dit que le forall peut être fait directement si la collection (le type record dans mon cas) reprend la structure de la table à alimenter. Cela signifie-t-il que ecla ne fonctionne pas avec une collection dont le schéma ne reprend que certaines colonnes de la table ?

    Cordialement,
    Je n'ai pas testé, mais je suppose que si les colonnes manquantes n'ont pas de contrainte NOT NULL, ça devrait passer

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 60
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    D'où l'intérêt de faire les algos lourds en manipulant des tableaux, puis de faire un INSERT final, qui au passage peut gagner en performance en l'utilisant avec un FORALL (documenté dans le tutoriel PL/SQL du site).
    Bonjour dgi77,

    j'ai imprimé, lu et testé le cours de SheikYerbouti concernant l'utilisation des collections et de FORALL. A plusieurs reprises, il est dit que le forall peut être fait directement si la collection (le type record dans mon cas) reprend la structure de la table à alimenter. Cela signifie-t-il que ecla ne fonctionne pas avec une collection dont le schéma ne reprend que certaines colonnes de la table ?

    Cordialement,

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

Discussions similaires

  1. [2005] Performances de XML dans une procédure stockée
    Par franculo_caoulene dans le forum Développement
    Réponses: 3
    Dernier message: 17/04/2009, 10h40
  2. Performance insertion dans une table partitionnée
    Par Invité dans le forum Administration
    Réponses: 6
    Dernier message: 10/04/2008, 18h06
  3. Réponses: 3
    Dernier message: 29/08/2007, 20h43
  4. probléme avec une requete insert dans une procédure stockée
    Par amelhajer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/05/2007, 11h03
  5. Réponses: 10
    Dernier message: 22/11/2004, 22h37

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