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

SQL Oracle Discussion :

Insertion d'une table temporaire dans 2 tables [10g]


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut Insertion d'une table temporaire dans 2 tables
    Bonjour à vous tous,

    Je vous écris car je débute actuellement sous une base de données Oracle. Je n'ai pas beaucoup d'expérience et j'aurais besoin de vos conseils.
    Ceci est la toute première fois que j'écris un message pour demander de l'aide sur ce forum que je connais depuis peu, alors j'espère ne pas avoir fait d'erreur qui pourrait vous énerver.

    Je travaille sous une base de données Oracle 10g et j'essaye d'accéler une procédure PL/SQL dans laquelle 3 requêtes SQL sont particulièrement gourmandes en terme de temps.

    Concrètement, je crée une table temporaire tabA qui sera par la suite insérée dans deux autres tables tabB(totalement) et tabC(partiellement).
    (1) Création de tabA : elle fait autour de 10 millions de lignes il me semble (après avoir été remplie) et ne possède ni index, ni partition. Il y a en revanche des conditions sur certaines colonnes pour que la valeur contenue soit non NULL
    (2) Insertion de toutes les lignes de tabA dans tabB sans exception
    (3) Insertion des lignes de tabA dans tabC selon une condition (WHERE) portant sur la valeur numérique d'un champ : la table tabA dispose de plusieurs champs dont un dénommé DOCUMENT_TYPE pouvant valoir 4 ou 6. Si la valeur est 4 la ligne est insérée dans tabB; sinon non.

    Les tables tabB et tabC sont des tables déjà partitionnées sur d'autres champs et je n'ai pas le droit de modifier cette structure. Ces deux tables possèdent plusieurs clés secondaires et plusieurs indexs.

    J'ai lu quelques posts et quelques articles. J'ai essayé d'utiliser un index B-Tree sur le champ DOCUMENT_TYPE mais je n'ai noté aucune accélération notable. J'en ai profité pour tester certaines méthodes pour insérer dans deux tables à la fois en une requête mais je n'ai pas eu de meilleurs temps d'exécution; la durée a d'ailleurs dans certains cas augmentée.


    Avez-vous des pistes à me proposer pour pouvoir accélerer la durée totale d'exécution de ces 3 requêtes.

    Merci d'avance de vos réponses.

  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
    Il y a peu des détailles sur ce que vous faite en réalité et où ça coince pour pouvoir données des bons conseils.
    Comme ça avez-vous déjà essayez le multi-table insert ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Je vous fait parvenir plus d'informations sur la structure des tables et sur ce que j'ai essayé de faire.
    Je suis désolé si les noms ne sont pas explicites mais pour des raisons de confidentialité, j'ai été obligé de renommer les éléments.

    En pièce jointe vous pourrez trouver en détail dans le fichier "InformationsTables.xls" les informations sur la structure des tables avec les champs, les indexs et le partitionnement dans le cas où cela vous serait utile.
    Les 3 requêtes vous sont présentées dans le fichier "Requêtes.sql".

    Pour accélérer la durée totale j'ai essayé :

    - d'utiliser le INSERT ALL multiple TABLES mais le temps d'exécution était plus grand que celui obtenu par la somme du temps des deux requêtes.
    De mémoire j'ai réalisé un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT ALL 
    WHEN (DOCUMENT_TYPE=4) THEN INTO tabB (<liste de champs>)
    WHEN 1=1 THEN INTO tabC (<liste de champs>)
             SELECT /*PARALLEL(TMP,4)*/
                        <liste de champs>
             FROM tabA TMP
    - d'utiliser un hint append sur les deux requêtes d'insertion et sur la requête avec le INSERT ALL pour voir si l'insertion pouvait se passer plus vite. Mais à la place je n'ai pas eu de gain de temps parfois même j'ai eu un ralentissement.
    Fichiers attachés Fichiers attachés

  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
    Et combien de temps dure le traitement ?
    Pourriez-vous faire une trace SQL pour voir où le temps passe ?
    Entre la création de la table temporaire et le chargement des autres tables il y a des autres traitements, requêtes qui sont exécutées ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Comme vous me l'avez demandé, je vous fais parvenir les traces d'exécution SQL de mes requêtes.
    Veuillez m'excuser si je réponds aussi tardivement mais du fait du mercredi et jeudi fériés puis du pont, je n'ai pas pu obtenir ces informations plus tôt.

    Pour vous répondre mnitu, il ya des requêtes entre la création de la table table1 et de la table2 qui utilisent table1 dans des opérations où l'on n'intéragit avec la table1 qu'avec des opérations de lecture (SELECT).
    Il n'y a en revanche pas de requêtes entre la création de la table 2 et de la table3.

    Merci d'avance de vos réponses et de vos commentaires.

    Zidmann
    Fichiers attachés Fichiers attachés

  6. #6
    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
    Votre principal événement d’attente est "db file sequential read", d’habitude associé à une lecture via l’index ce qui apparemment n’est pas votre cas. Prenez la première requête chercher les lignes concernant cet événement dans le fichier brut des traces et chercher les 3 paramètres p1, p2 et p3. A partir de leur valeur identifiez l’objet qui est concerné par ces lectures.

  7. #7
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Vous insérez 3 millions de lignes en faisant 41,5 millions de lectures logiques (logical I/O). Ce qui veut dire 41,5/3 = 13 lectures logiques par insertion.

    La différence entre Elapsed et CPU est de 1021 secondes représentant le temps d'attente de votre insert. Une bonne coïncidence avec le temps d'attente db file sequential read de 1027 secondes

    db file sequential read concerne normalement des accès via index. Mais votre plan d'exécution ne montre que des full table scan. Il y a donc de fortes chances que ces db file sequential read (qui sont en fait des physical I/O suivis par des logical I/O) proviennent de l'undo tablespace afin de garantir une lecture consistante (read consistency).

    Est-ce que la table TABLE1 est modifiée lorsque vous êtes en train d'insérer dans la table TABLE2?
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour Mohamed.Houri,

    Comment me conseillez-vous de m'y prendre exactement pour vérifier si la table TABLE1 est modifiée pendant l'insertion dans la table TABLE2 ?

  9. #9
    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
    Y a-t-il des indexes sur la table TABLE 2 ?

  10. #10
    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
    Je pense que ce n’est pas la lecture consistent mais la maintenance des indexes qui plombe les perfs.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour mnitu,

    Oui, il y a des indexs sur la table TABLE2 et dans TABLE3 aussi, comme celà est indiqué dans le document "InformationsTables.xls".

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour mnitu,

    Dans ce cas, me conseilleriez-vous de désactiver les indexes avant l'insertion et de les reconstruire après l'insertion ?

    Je voulais aussi vous demander si vous ne pensez pas si le partitionnement des tables peut aussi y être pour quelque chose.

  13. #13
    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
    Pour l'instant ajoutez le hint /*+ APPEND */ pour faire un test en direct path load.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT /*+ APPEND */ INTO TABLE2 ...

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Je n'ai actuellement pas accès à la bdd avec les trois tables mais je sais que j'avais déjà essayé d'utiliser le hint Append.

    Durant mon test : j'avais crée une boucle de 3 itérations dans laquelle j'alternais les insertions avec et puis sans hint Append pour voir combien de temps chaque requête prenait de temps pour s'exécuter.. Entre deux insertions je réalisais bien sur un ROLLBACK.

    Il est apparu qu'il n'y avait aucun gain.
    Les durées étaient semblables à quelques secondes près

  15. #15
    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
    Essayez alors de supprimer les indexes et les récréer après le chargement des tables.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Je vais désactiver les indexes (DISABLE), faire l'insertion et reconstruire les indexs (REBUILD) plutôt. Je n'aurais les résultats que demain en revanche. Je vous les communiquerai dans un fichier Excel sur ce forum.

    Merci d'avoir jeté un coup d'oeil à mon problème et à mes derniers posts.

  17. #17
    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 Zidmann Voir le message
    ...
    Je vais désactiver les indexes (DISABLE)...
    Ça pourrait s'avérer un poil compliqué:
    DISABLE applies only to a function-based index. This clause lets you disable the use of a function-based index. You might want to do so, for example, while working on the body of the function. Afterward you can either rebuild the index or specify another ALTER INDEX statement with the ENABLE keyword.
    Mais il y en a unusable.

  18. #18
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    @Zidmann
    Le hint /*+ append */ ne sert à rien si votre table destination possède des triggers ou des contraintes d'intégrités (FK). Il sera silencieusement ignoré.
    Si vous partez de tables vides il est intéressant de mettre les indexes dans un statut 'unusable' et les reconstruire par la suite. Mais si le volume à insérer et très petit par rapport au volume de données existant, cela ne sert à rien de "disabler" vos indexes car vous allez perdre du temps lors de leur reconstruction.

    Si vos tables sont par contre partitionnées, pensez alors à ''disabler'' uniquement les partitions des indexes locaux correspondant aux partitions de la table que vous allez toucher par votre insert. Ainsi, vous allez reconstruire uniquement les partitions touchées. Ce qui n’est pas le cas des indexes globaux.
    Dans votre fichier trace je n'ai vu aucune instruction insert. Est-ce que vous êtes sûr que ce fichier correspond à un insert/select ou uniquement à la partie select.
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  19. #19
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour Mohamed.Houri,

    Le problème justement c'est que je ne pars pas avec des tables d'arrivée vides.
    TABLE 2 et TABLE3 sont très lourdes. TABLE3 sert d'ailleurs de table d'archivage qui contient l'historique de certaines informations. La seule table vide est la table que je créé : TABLE1.

    Pour savoir le rapport entre le volume inséré et le volume total, il faudra attendre demain pour obtenir cette information.

    Le partitionnement se fait sur un critère qui n'est pas un critère bateau comme la date, le mois, l'année, une couleur enfin des trucs de ce genre.
    Lors de l'insertion, je pense que beaucoup de partitions sont concernées. Il faudra que je recherche cette information également.

    Autre détail, il ne me semble pas que les indexes ne sont pas locaux mais tous globaux.

    Pour ce qui est du fichier trace, je peux vous assurer qu'il s'agit bien de requêtes de la forme insert/select mais je vais quand même jetter un coup d'oeil demain pour en être sur.

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2013
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    J'ai regardé combien de lignes étaient insérées et combien de partitions étaient touchées. Voici mes résultats :

    Table2:
    Nb de partitions sollicitées 3826
    Nb de lignes insérées 3140868
    Nb de lignes après insertion 43502548
    Proportion des lignes insérées (en %) 7,219963

    Table3:
    Nb de partitions sollicitées 3553
    Nb de lignes insérées 1567187
    Nb de lignes après insertion 20038390
    Proportion des lignes insérées (en %) 7,820923

    Est-ce que ceci vaux le coût selon vous de détruire les indexes et de les re-créer par la suite ?

    Merci d'avance de vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Insertion d'une nouvelle ligne dans la table
    Par boby15000 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/05/2008, 17h49
  2. Insertion des enregistrements d'une table temporaire dans un état
    Par Chayanne47 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/04/2008, 11h46
  3. Réponses: 8
    Dernier message: 06/06/2007, 17h03
  4. Réponses: 2
    Dernier message: 25/01/2007, 11h34
  5. Réponses: 18
    Dernier message: 26/07/2006, 14h51

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