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 :

Performance d'une requête


Sujet :

SQL Oracle

  1. #41
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    La trace ce n'est pas le plan d’exécution ?
    Non, ce sont deux choses différentes.
    Voici comme activer et lire une trace :
    http://oracle.developpez.com/guide/tuning/tkprof/

  2. #42
    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 AbouZaid Voir le message
    Je n'ai aucun trigger sur la table en question.
    ...
    Ok. J'ai trouvé un peu trop élevé le nombre des requêtes récursives.
    Statistiques
    ----------------------------------------------------------
    33109 recursive calls
    ...

  3. #43
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    En fait mon programme se divise en trois grandes partie :

    1 - Charger depuis un fichier plat les lignes dans la table INTERFACE

    2 - Enrichir(update) les colonnes de la table depuis d'autres tables

    3 - Contrôler que les données enrichies sont correctes sinon udapte de la table pour les lignes concernées.

    Donc en fin de compte je fais beaucoup de mise à jour, et je crée, puis drop les index dynamiquement dans le package.

    Le temps est un point très important et j'ai une plage à ne pas dépasser...

  4. #44
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il fallait commencer par là, si le temps est important pour vous ce n'est pas du tout ce qu'il faut faire.

    Dans les grandes lignes :
    1. Créer une table externe qui pointe vers votre fichier
    2. Écrire un select qui sort les bonnes données avec les bonnes jointures
    3. Effectuer un merge ou insert into table finale depuis le select précédent selon le besoin

  5. #45
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    J'ai trouvé tkprof, mais je n'ai pas compris comment l'utiliser sur une requête.

    Pouvez vous m'aider svp?

  6. #46
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Dans les grandes lignes :
    1. Créer une table externe qui pointe vers votre fichier
    C'est la table INTERFACE, il faut que je charge les données du fichier pour pouvoir les exploiter.

    Citation Envoyé par Waldar Voir le message
    Dans les grandes lignes :
    1. Écrire un select qui sort les bonnes données avec les bonnes jointures
    Il faut que je récupère toutes valeurs qu'elles soient bonnes ou mauvaises, car à la fin de mon programme, il y a un compte rendu relatant toutes les mauvaises valeurs lors de l'enrichissement et du contrôle.

  7. #47
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Dans le même sens que Waldar, si tu as beaucoup d'étapes de mise à jour successives, tu peux peut être commencer par charger dans une table temporaire, effectuer le job dessus, et finir par insérer la version définitive dans INTERFACE.

    L'avantage étant de générer potentiellement beaucoup moins de redo...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  8. #48
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Dans le même sens que Waldar, si tu as beaucoup d'étapes de mise à jour successives, tu peux peut être commencer par charger dans une table temporaire, effectuer le job dessus, et finir par insérer la version définitive dans INTERFACE.

    L'avantage étant de générer potentiellement beaucoup moins de redo...
    Les mises à jour, je vais le faire soit sur une table temp, soit sur INTERFACE directement, et du moment que les index je peux les créer et supprimer sans problème sur INTERFACE, pourquoi je vais ajouter une autre étape dans ma boucle?

    Cet update, prendra le même temps, puisque dans la table TEMP, il y aura aussi 2,5 millions d'écritures.

  9. #49
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    A vrai dire, pas tout à fait le même temps...

    La table normale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> CREATE TABLE pastempt AS
      2  SELECT level l
      3  FROM DUAL
      4  CONNECT BY level <= 1000000;
     
    Table crÚÚe.
     
    EcoulÚ : 00 :00 :06.03
    L'update de la table normale :

    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
     
    SQL> set autot on statistics
    SQL> UPDATE pastempt SET l = l + 1;
     
    1000000 ligne(s) mise(s) Ó jour.
     
    EcoulÚ : 00 :00 :38.08
     
    Statistiques
    ----------------------------------------------------------
            662  recursive calls
        2041212  db block gets
           1882  consistent gets
           2058  physical reads
      465180960  redo size
            379  bytes sent via SQL*Net to client
            305  bytes received via SQL*Net from client
              3  SQL*Net roundtrips to/from client
              2  sorts (memory)
              0  sorts (disk)
        1000000  rows processed
    La table temporaire :
    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
     
    SQL> CREATE GLOBAL TEMPORARY TABLE tempt AS
      2  SELECT level l
      3  FROM DUAL
      4  CONNECT BY level <= 1
      5  /
     
    Table crÚÚe.
     
    SQL> INSERT INTO tempt
      2  SELECT level l
      3  FROM DUAL
      4  CONNECT BY level <= 1000000;
     
    1000000 ligne(s) crÚÚe(s).
     
    EcoulÚ : 00 :00 :04.04
    L'update de la table temporaire :

    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
     
    SQL> UPDATE tempt SET l = l + 1;
     
    1000000 ligne(s) mise(s) Ó jour.
     
    EcoulÚ : 00 :00 :24.01
     
    Statistiques
    ----------------------------------------------------------
            591  recursive calls
        2024026  db block gets
           1822  consistent gets
           1496  physical reads
      164687196  redo size
            378  bytes sent via SQL*Net to client
            302  bytes received via SQL*Net from client
              3  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
        1000000  rows processed
    Il y a une différence sur le redo généré...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  10. #50
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Et pour appuyer également les arguments de Waldar, quand tu crées une table en faisant un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE TABLE [GLOBAL TEMPORARY]tatable AS 
    SELECT lesbonnesvaleursquicorrespondentatamiseajour
    FROM ta_table_a_modifier
      JOIN ta_table_qui_contient_les_donnees_a_affecter ON ...
    Tu gagnes aussi ... par exemple, tu as pu voir que le CREATE TABLE initial remplit les lignes de la table à créer, le tout en 4 secondes...

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  11. #51
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    J'ai trouvé tkprof, mais je n'ai pas compris comment l'utiliser sur une requête.

    Pouvez vous m'aider svp?
    Faudrait peut-être pas trop abuser, il y a tout dans le tutoriel

    C'est pas une trace de requête mais de session. Tu mets ta session en trace, tu lances ton programme, tu arrêtes la trace et tu lances le tkprof pour faciliter l'interprétation de la trace... y'a plus qu'à lire le détail dans le tuto

  12. #52
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Et bien c'est le tuto que je n'ai pas compris.

    Je ne peux pas lancer la trace rien que pour ma requête d'UPDATE?

  13. #53
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Non, on trace une session... suffit de lancer l'update dans la session pour qu'elle soit dans la trace.

    Quand on suit une trace à la chasse, on peut pas tracer que les sangliers borgnent... on trace tous les passages et dedans, on trouvera les sangliers borgnent

  14. #54
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Ok, j'ai activé la trace pour ma session, mais sur le tuto il n'y a pas un exemple pour lancer tkprof.

  15. #55
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut

  16. #56
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Je comprends que vous incitez les gens à chercher d'abord, mais dans mon cas, Google a été la première alternative et c'est parce que je n'ai pas trouvé de réponse que je suis venu vous demander conseils.

  17. #57
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073

  18. #58
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    Oui j'ai fait aussi mes recherches!!

    Je vais être plus explicite : Je ne sais pas d'où j'obtiens le fichier trace en entrée dans tkprof.

  19. #59
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Par défaut il est dans le répertoire udump que l'on trouve en tapant sous SQL*Plus :
    show parameter user_back

  20. #60
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Points : 102
    Points
    102
    Par défaut
    cette commande ne m'a rien retournée sur SQL*PLUS.

Discussions similaires

  1. [TSQL] Performance d'une requête "exists"
    Par dj_lil dans le forum Développement
    Réponses: 2
    Dernier message: 04/01/2008, 11h45
  2. Réponses: 8
    Dernier message: 21/09/2007, 14h51
  3. [MySQL 5]Performance d'une requêtes select
    Par SuperCed dans le forum Requêtes
    Réponses: 8
    Dernier message: 01/08/2006, 12h51
  4. [SQL2K] Problème anormal de performance d'une requète
    Par G. Goossens dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/03/2006, 12h06
  5. [SQL ] performances dans une requête
    Par claralavraie dans le forum Oracle
    Réponses: 12
    Dernier message: 05/01/2006, 17h54

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