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 :

Lenteur à l'exécution de la requête


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2017
    Messages : 13
    Points : 9
    Points
    9
    Par défaut Lenteur à l'exécution de la requête
    Bonjour à tous,

    Nous avons passé notre base de la V11 à la V12. Depuis nous constatons un gain important sur l'ensemble de nos requêtes, sauf sur une ou la perte de temps est colossale et n'est pas compensé par le gain obtenu sur les autres requêtes.

    La requête en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE TH_RECLAMATION R 
    SET R.DATE_ETAT_T = (SELECT MIN(NVL(RC.DHISTO,XDATE)) DATE_ETAT FROM US_ODS.TS_RECLAMATION_COM RC,T_EVNT_ELEMENT@DBLINK_H8803_CC_00 TE WHERE UPPER(TE.ACTION) = 'TRAITEMENT' AND RC.EVNT = TE.CODE AND RC.NUME_RECL = R.ID_RECL) WHERE (R.STA_RECL = 't' OR R.STA_RECL = 'x' OR R.STA_RECL = 's')
    Il s'agit de l'update d'une table via un select d'autre table.

    Un explain plan de cette requte nous renvoi ceci :

    Nom : CaptureOracle.PNG
Affichages : 817
Taille : 27,5 Ko

    La mise à jour des statistiques sur les tables concernées à hauteur de 10% ne résout visiblement pas le souci, l'explain plan reste identique. Le rebuild de l'index de la table TH_RECLAMATION ne résout pas le problème.

    Ma question est donc la suivante, par quel bout dois je prendre le problème pour le résoudre, le temps annoncé par l'ex-plain plan de 7:00:00 est énorme, mais je ne sais pas comment savoir ce qui explique ce temps élevé. C'est d'autant plus étonné que sur les 130 Jobs réalisés seul celui-ci a un moins bon résultat qu'avant la migration.

    D'avance merci,
    Yo

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Essaye de reformuler la requête avec un MERGE (sans la branche WHEN NOT MATCHED bien sûr ).
    Cette commande est souvent beaucoup plus efficace qu'un UPDATE avec jointure.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Bonjour,

    Déjà le fait de préciser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPPER(TE.ACTION) = 'TRAITEMENT'
    va empêcher l'utilisation potentielle d'un index sur TE.ACTION, sauf si tu crées un FBI. Es-tu obligé de faire cet UPPER?
    De plus, y-a-t-il un index sur R.STA_RECL? Tu mets à jour que pour 3 valeurs de cette colonne, mais peut-être que ce n'est pas assez sélectif.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Et aussi, remplacer la jointure décrite dans le WHERE par l'utilisation de l'opérateur JOIN, ça peut jouer et ce sera plus clair

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2017
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Merci pour vos réponses !

    Je complexifie le problème, je n'ai pas vraiment la main sur la requête, disons que j'ai plutôt le rôle DBA que développeur ici. Ce qui m'amène a chercher dans la voie DBA c'est que cette même requête prenait 4 fois moins de temps en 11 qu'en 12.

    Je n'ai pas d'index sur STA_RECL uniquement sur ID_RECL

    Le constat que j'ai pu faire c'est qu'oracle fait une grosse opération de lecture sur le Tablespace au moment du passage de la requête.

    Bonne journée,

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 137
    Points : 1 917
    Points
    1 917
    Par défaut
    Tu as le même plan d'exécution en 11g?

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Les colonnes de jointure portent des noms différents, du coup, question de base : sont elles bien de même type et de même longueur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           AND RC.EVNT      = TE.CODE 
           AND RC.NUME_RECL = R.ID_RECL
    Un index sur STA_RECL ne sera pertinent que si les valeurs recherchées sont discriminantes. A vérifier.

  8. #8
    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 yoyolut Voir le message
    je n'ai pas vraiment la main sur la requête, disons que j'ai plutôt le rôle DBA que développeur ici.
    Vous avez tout à fait le droit de proposer une meilleure requête aux développeurs.
    En en plus vous pouvez supplanter le plan d'une requête par une autre en tant que DBA.

    Ca vaut vraiment le coup de vérifier ce merge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     merge into TH_RECLAMATION tgt
     using ( select RC.NUME_RECL
                  , min(NVL(RC.DHISTO, XDATE)) as DATE_ETAT
               from US_ODS.TS_RECLAMATION_COM         RC
               join T_EVNT_ELEMENT@DBLINK_H8803_CC_00 TE on TE.CODE = RC.EVNT
              where UPPER(TE.ACTION) = 'TRAITEMENT'
           group by RC.NUME_RECL) src
        on (src.NUME_RECL = tgt.ID_RECL
       and  tgt.STA_RECL in ('t', 'x', 's'))
      when matched then update
       set tgt.DATE_ETAT_T = src.DATE_ETAT;
    Edit : Coquille corrigée, merci al1_24.

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Attention ligne 10 : whennot matched then update
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2017
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Merci à tous pour vos réponses

    Je vais travailler au sujet avec vos propositions. Et recherche la réponse à certaines questions que vous posez. Je fais cela demain. Et je vous ferrais un retour.

    Pour répondre a l'aspect philosophique, oui je peux proposer une meilleure option au développeur, mais il n'est pas en interne c'est un outil tierce. Et mon souci est le fameux ça marchait en 11 ça doit marché en 12.

    Bonne soirée à tous,

  11. #11
    Membre éprouvé
    Femme Profil pro
    Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Inscrit en
    Août 2017
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 56
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Service informatique presque à moi seule (TPE), ex-architecte fonctionnel
    Secteur : Finance

    Informations forums :
    Inscription : Août 2017
    Messages : 358
    Points : 931
    Points
    931
    Par défaut Index à tester
    Existe t-il un index sur les colonnes NUME_RECL (desc), DATE_HISTO (desc) sur la table TS_RECLAMATION_COM ?
    Sinon, cela vaut vraisemblablement la peine d'en créer un.

    Ainsi peut-être qu'un index bitmap (index pour les valeurs de faible cardinalité) sur la colonne STA_RECL de la table TH_RECLAMATION :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE BITMAP INDEX 
    sta_recl_bitmap_idx
    ON TH_RECLAMATION (STA_RECL);

    On peut aussi tenter :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE BITMAP INDEX 
    action_evnt_bitmap_idx 
    ON T_EVNT_ELEMENT (UPPER(ACTION));

    Puisque la requête met à jour une colonne date, il faudrait aussi vérifier s'il existe un (ou plusieurs) index dessus ; s'il est vraiment TRÈS pénalisant en Update, cela vaut peut-être la peine de le dropper, quitte à le recréer après le batch ; j'ignore combien de temps il faudrait à Oracle pour reconstruire l'index, mais ça peut valoir la peine.
    Les problèmes sont des opportunités en vêtements de travail. Henry H. Kaiser
    Il n'est pas de problème dont une absence de solution ne finisse par venir à bout. Henri Queuille

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 936
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 936
    Points : 4 356
    Points
    4 356
    Par défaut
    À essayer :
    créer une vue côté DBLINK avec le WHERE UPPER avec un index sur le UPPER(TE.ACTION) et accéder cette vue dans votre query.

Discussions similaires

  1. [AC-2016] Lenteur dans l'exécution de ma requête
    Par Rayan1 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 02/07/2020, 14h59
  2. Réponses: 8
    Dernier message: 28/09/2011, 16h18
  3. [AC-2007] Lenteur d'exécution requête outer join
    Par j.lebowski dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/07/2010, 11h55
  4. [MySQL] Lenteur pour exécuter un requête SQL
    Par jean tof dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/01/2007, 13h59
  5. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11

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