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. #21
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Oui un seul index sur (FLAG_JOURNAL, STATUS)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Rhoooo le COST

  3. #23
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Heuuu, qlq explications ne seraient pas de trop...

  4. #24
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Votre flag est un caractere ???

  5. #25
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211

  6. #26
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    J'ai simplifié ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update Table
    set JOURNAL = 'AUTRE'
    ,    FLAG_JOURNAL = w_CTRL_JOURNAL
    ,    FLAG_LIGNE = greatest (w_CTRL_JOURNAL, FLAG_LIGNE)
    where  JOURNAL = 'AUTRE_0'
    Avec un index sur 'JOURNAL'.

    Mais cette requête me prend 4 min sur une table de 2,5 millions de lignes.

    Est ce que c'est normal?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    C'est pas délirant, faut voir si il y a des indexes sur les colonnes mises à jour, ce qui imposerait de les mettre à jour et donc prend du temps, les perfs des disques, la fragmentation, etc.

    Encore une fois, sans trace point de salut

  8. #28
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    bonjour,

    voici des informations utiles :

    La table fait : 2 551 724 enregistrements.
    dont : 133 406 avec JOURNAL = 'AUTRE_0'
    et : 2 418 318 avec JOURNAL = 'AUTRE'

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    SQL> create index INTERFACE_ND3 on INTERFACE(JOURNAL);
     
    Index créé.
     
    Ecoulé : 00 :00 :19.31
    SQL> update INTERFACE  set 
      2    JOURNAL = 'AUTRE'
      3   , FLAG_JOURNAL  ='2'
      4   ,  FLAG_LIGNE   =  greatest('2' , FLAG_LIGNE )
      5   where  JOURNAL = 'AUTRE_0';
     
    2418318 ligne(s) mise(s) à jour.
     
    Ecoulé : 00 :04 :08.39
     
    Plan d'exécution
    ----------------------------------------------------------
       0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=66760 Card=2533034
               Bytes=27863374)
     
       1    0   UPDATE OF 'INTERFACE'
       2    1     TABLE ACCESS (FULL) OF 'INTERFACE' (TABLE) (Cost=
              66760 Card=2533034 Bytes=27863374)
     
     
     
     
     
    Statistiques
    ----------------------------------------------------------
          33109  recursive calls
       17624580  db block gets
         577957  consistent gets
         225215  physical reads
     2071711192  redo size
            389  bytes sent via SQL*Net to client
            436  bytes received via SQL*Net from client
              3  SQL*Net roundtrips to/from client
              2  sorts (memory)

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Pas sûr que ça change quelque chose, mais réessaie après avoir calculé les statistiques sur ton index...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     exec dbms_stats.gather_index_stats(null, 'INTERFACE_ND3')

  10. #30
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    c'est fait et j'ai lancé encore une fois la requête :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    SQL>  update INTERFACE  set 
      2     JOURNAL = 'AUTRE'
      3    , FLAG_JOURNAL  ='2'
      4    ,  FLAG_LIGNE   =  greatest('2' , FLAG_LIGNE )
      5    where  JOURNAL = 'AUTRE_0';
     
    2418318 ligne(s) mise(s) à jour.
     
    Ecoulé : 00 :03 :55.32
     
    Plan d'exécution
    ----------------------------------------------------------
       0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=66760 Card=2533034
               Bytes=27863374)
     
       1    0   UPDATE OF 'INTERFACE'
       2    1     TABLE ACCESS (FULL) OF 'INTERFACE' (TABLE) (Cost=
              66760 Card=2533034 Bytes=27863374)
     
     
     
     
     
    Statistiques
    ----------------------------------------------------------
            170  recursive calls
       17124612  db block gets
         240323  consistent gets
         248659  physical reads
     1839948160  redo size
            392  bytes sent via SQL*Net to client
            441  bytes received via SQL*Net from client
              3  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
        2418318  rows processed

  11. #31
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    voici des informations utiles :

    La table fait : 2 551 724 enregistrements.
    dont : 133 406 avec JOURNAL = 'AUTRE_0'
    et : 2 418 318 avec JOURNAL = 'AUTRE'
    Ne serait-ce pas plutôt l'inverse ?

    Citation Envoyé par AbouZaid Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    update INTERFACE
       ...
     where JOURNAL = 'AUTRE_0';
     
    2418318 ligne(s) mise(s) à jour.

  12. #32
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Oui désolé c'est l'inverse.

    Il y a beaucoup plus de ligne avec

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Bah oui, il utilise pas l'index du coup, c'est normal

  14. #34
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Bah oui, il utilise pas l'index du coup, c'est normal
    Y a un moyen pour accélérer la requête?

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

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Tu dois faire cette opération souvent ?
    Parce que 4 minutes en oneshot, c'est pas la mort...

    ... sinon tu peux te demander pour qu'elle raison tu dois faire ça... et revoir ta logique de traitement.

    Et en dernier recours, tu as les méthodes brutales CTAS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TABLE INTERFACETMP AS
    SELECT Lescolonnespasmisesàjour, CASE WHEN JOURNAL = 'AUTRE_0' THEN 'AUTRE' ELSE JOURNAL END as journal, 
    CASE WHEN JOURNAL = 'AUTRE_0' THEN '2' ELSE FLAG_JOURNAL END as flag_journal,
    CASE WHEN JOURNAL = 'AUTRE_0' THEN greatest('2', FLAG_LIGNE) ELSE FLAG_LIGNE END as flag_ligne
    FROM INTERFACE;
     
    DROP TABLE INTERFACE;
     
    ALTER TABLE INTERFACETMP RENAME TO INTERFACE;
    A manier avec prudence (et adaptation sur les contraintes indexes, ...), et en accord avec ton DBA

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    Y a un moyen pour accélérer la requête?
    J'ai pas pensé à prendre ma boule de crystal et comme tu sembles pas décidé à nous sortir les traces ça risque d'être compliqué de répondre

    Mais je doute que tu puisses faire grand chose, il y a tout à croire que le temps passe dans les I/O, donc faut optimiser les accès disque.

  17. #37
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    Y a un moyen pour accélérer la requête?
    Oui, supprimer vos index les colonnes de l'update : JOURNAL, FLAG_JOURNAL et FLAG_LIGNE.

    Celui sur JOURNAL, vous l'avez créé pour ce besoin mais en fait vous ne l'utilisez pas, et vous le mettez à jour vraiment pour rien.

    Si vous avez besoin pour d'autres requêtes des index, s'ils existent sur FLAG_JOURNAL et FLAG_LIGNE, il faut comparer le temps de mise à jour avec index et celui de mise à jour sans index + reconstruction.
    Pas dit que la différence soit flagrante, et attention aux accès concurrents si vous supprimez l'index.

  18. #38
    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
    L'index sur la colone journal ne sert à rien.
    Mais, je pense que votre table a un(des) trigger(s) en Update (probablement For each Row). Je me trompe ou pas ?

  19. #39
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Citation Envoyé par orafrance Voir le message
    J'ai pas pensé à prendre ma boule de crystal et comme tu sembles pas décidé à nous sortir les traces ça risque d'être compliqué de répondre

    Mais je doute que tu puisses faire grand chose, il y a tout à croire que le temps passe dans les I/O, donc faut optimiser les accès disque.
    La trace ce n'est pas le plan d’exécution? Car je n'ai pas arrêté de mettre les plans d’exécutions de mes requêtes.

    Si ce n'est pas le cas, merci de m'aider à vous produire la trace que vous voulez...

  20. #40
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Citation Envoyé par mnitu Voir le message
    L'index sur la colone journal ne sert à rien.
    Mais, je pense que votre table a un(des) trigger(s) en Update (probablement For each Row). Je me trompe ou pas ?
    Je n'ai aucun trigger sur la table en question.

    Je fais beaucoup de mise à jour dans mon programme. Et à la fin un delete. c'est tout.

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