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

Administration Oracle Discussion :

Optimisation requête SQL


Sujet :

Administration Oracle

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 227
    Points : 161
    Points
    161
    Par défaut Optimisation requête SQL
    Bonjour;

    Je me permets de solliciter votre aide car je ne trouve pas de solutions à mon problème.
    En faite j'ai une requête SQL pénalisante, que j'ai optimisé via SQL TUNING Advisor, mais la première exécution est toujours très lente, environ 10 minutes, les exécutions suivantes sont de 4 secondes, ceci est normal car les données sont toujours dans le cache Buffer.
    Je reviens vers vous si vous avez des idées afin d'optimiser le temps de réponse de cette requête (vues matérialisées,...?).
    Merci d'avance pour votre aide.

    Cordialement;

  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 803
    Points
    30 803
    Par défaut
    Sans connaitre la requête, les index existants ni le plan d'exécution actuel, il est difficile de donner des conseils...
    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 éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Hello,
    est-ce bien confirmé que systématiquement la 1ère exécution recherche les données sur disque ?
    En la lançant avec "set autotrace statistics on" tu confirmes que les disk reads disparaissent au bénéfice des buffer gets ?
    Et le plan d'exécution ne change pas ?
    S'il change il faudra peut être envisager un effet du cardinality feedback géré par le paramètre _optimizer_use_feedback.

    Et comme signale al1_24, avoir le plan d'exécution ne sera pas superflu.

  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
    Citation Envoyé par elharet Voir le message
    ...
    En faite j'ai une requête SQL pénalisante, que j'ai optimisé via SQL TUNING Advisor, mais la première exécution est toujours très lente, environ 10 minutes, les exécutions suivantes sont de 4 secondes, ceci est normal car les données sont toujours dans le cache Buffer.
    ...
    10 minutes vers 4 secondes ça ne s'explique pas par le fait que les données sont déjà en mémoire ou pas. Comme mentionné je pense plus à l'effet de cardinality feedback: première exécution prends un mauvais plan mais comme elle est surveillé l'optimisateur reoptimise la requête pour l'exécution suivante en changeant de plan. Commencez déjà par vérifier ce scénario. Ensuite il faut analyser la requête pour comprendre la raison de ce déraillement et utiliser une méthode appropriée si possible sans toucher aux paramètres internes d'Oracle.
    Remarque: SQL Tunning Advisor c'est un outil automatique qui fait de son mieux mais ce n'est pas le panacée universel, lisez The Oracle Advisors from a Different Perspective pour un exemple.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Février 2007
    Messages : 227
    Points : 161
    Points
    161
    Par défaut
    Bonjour;

    Je vous remercie pour vos réponses.
    J'ai mis autotrace en ON, et j'ai réexecuté la requête, le plan d'exécution est le même, mais le temps de réponse est différent, et les statistics sont différents.
    La première exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Statistics
    ----------------------------------------------------------
            462  recursive calls
              0  db block gets
        1886533  consistent gets
          44355  physical reads
              0  redo size
           1613  bytes sent via SQL*Net to client
            520  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              2  rows processed
    La deuxième exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
        1868765  consistent gets
            775  physical reads
              0  redo size
           1613  bytes sent via SQL*Net to client
            520  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              2  rows processed
    Merci encore une fois pour votre aide.

  6. #6
    Membre éprouvé Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Curieuse cette affaire !
    Le result cache ne serait-il pas en cause ?
    1) quelle est la version oracle ?
    2) peux t-on avoir le plan d'exécution et surtout les indications en fin de plan : sample size, filter...

  7. #7
    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
    semble dû au parsing hard de la requête, normal pour une première exécution. Et bien sûr leur "d'échauffement" de la base il est normal d'avoir plus des physical reads mais cela n'explique pas la difference 10 min vers 4 sec. "Refroidissez" la base et ré exécutez la requête en activant une trace sql étendue puis analysez les évènements d'attente et le parsing de la requête dans le fichier brut de trace ainsi généré, de cette manière vous allez comprendre où passent vos 10 minutes.

    Mais cela va vous aider seulement si vraiment le plan c'est le même et si vous exécutez vraiment la même requête.

Discussions similaires

  1. Optimisation requête SQL
    Par ludo00002 dans le forum SQL
    Réponses: 2
    Dernier message: 06/10/2008, 09h01
  2. Comment optimiser requête SQL avec création Index
    Par schumi101 dans le forum SQL
    Réponses: 25
    Dernier message: 11/12/2007, 21h28
  3. optimisation requête SQL
    Par marti dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2006, 08h54
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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