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 :

Plan d'exécution à la milli-seconde près pour une requête hyper rapide?


Sujet :

Administration Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut Plan d'exécution à la milli-seconde près pour une requête hyper rapide?
    Bonjour,

    En affichant un plan d'exécution, Oracle ne renseigne la colonne TIME qu'avec une précision au niveau de la seconde.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ------------------------------------------------------------------------------------------------------
    | Id  | Operation                           | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                    |                |     1 |    65 |     5   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| PC_RENDEMENT   |     1 |    65 |     5   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN                  | PC_RENDEMENT_1 |     5 |       |     2   (0)| 00:00:01 |
    ------------------------------------------------------------------------------------------------------
    Néanmoins, avec le hint GATHER_PLAN_STATISTICS, on descend au dixième de seconde.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select /*+ GATHER_PLAN_STATISTICS */ debut, fin from T1 where ((l_support = '205') and ((edn <= 79) and ((dn <= 79) and (((edx > 64) or (dx > 7)) and (xa > 796)))));
    
    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST'));
    PLAN_TABLE_OUTPUT
    ----------------------------------------------------------------------------------------------------------------
    | Id  | Operation                           | Name           | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ----------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT                    |                |      1 |        |      1 |00:00:00.01 |       5 |
    |*  1 |  TABLE ACCESS BY INDEX ROWID BATCHED| PC_RENDEMENT   |      1 |      1 |      1 |00:00:00.01 |       5 |
    |*  2 |   INDEX RANGE SCAN                  | PC_RENDEMENT_1 |      1 |      5 |      5 |00:00:00.01 |       3 |
    ----------------------------------------------------------------------------------------------------------------

    Est-il possible d'aller facilement plus bas, au niveau de la milli-seconde par exemple? Par facilement j'entends sans passer par une trace 10053...
    Mon objectif est de tuner la requête et comme elle est hyper simple et s'exécute très vite, il me faut la valeur la plus précise possible.
    Précision : elle s'exécute très vite MAIS le client la lance 50 000 fois dans un batch et le batch prend presque 5 heures, donc on veut tuner celle-ci.

    [EDIT]
    Je vois que dans V$SQL on a des temps en micro-secondes
    Je vais tester ça...


    Merci pour vos idées.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    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
    Pour optimiser une requête qui va hyper vite, on regarde sa consommation I/O, CPU et mémoire, pas vraiment le temps consommé.
    Autotrace devrait vous fournir ces informations (j'ai un doute sur la mémoire cela dit).

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    A vrai dire, vous avez déjà des informations au centième de seconde dans ce que vous montrez !
    Dans v$sql_plan_statistics_all, la colonne last_elapsed_time fournit les temps en microsecondes de chaque étape du plan pour la dernière exécution de la requête.
    Si le détail de chaque étape ne vous intéresse pas, vous pouvez filtrer sur "operation='SELECT STATEMENT'" pour avoir le temps du SELECT total.

    Mais de toute façon, travailler au niveau des centièmes de secondes est déjà sans intérêt, car d'une exécution à l'autre la fluctuation peut être importante, sans qu'il n'y ait de raison particulière. On risque donc surtout de tirer de mauvaises conclusions !
    Par exemple, si la requête, après reformulation, passe de 0,2 à 0,1 seconde, on ne peut absolument rien en conclure, car on est en plein dans la marge de fluctuation.

    Pour des requêtes dont la durée d'exécution est inférieure à la seconde, il est préférable de faire tourner la requête plusieurs dizaines ou centaines de fois pour atteindre des temps d'au moins 10 secondes.
    On pourra alors déterminer plus fiablement que telle modification a amélioré ou dégradé les temps dans telle proportion.

    De plus, si on s'intéresse juste au temps d'exécution global (et non de chaque étape du plan), un bon vieux SET TIMING ON dans SQL*Plus fera l'affaire, puisqu'il a une résolution au centième de seconde.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  4. #4
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Un gros merci à vous deux, vos conseils sont excellents
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Une solution est de lancer la requête 1000 fois et de regarded 'ALLSTATS' sans le 'LAST' pour voir le temps cumulé sur toutes les exécutions du curseur. Avec au besoin un flusg shared pool avant pour être sûr de partir à zéro. Mais le meilleur tuning serait d'éviter de lancer 50000 fois. Beaucoup de temps est passé en latence réseau et switch de contexte (et sur Intel ça va être pire avec les fixes des dernières vulnérabilités )
    Cordialement
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/10/2008, 14h34
  2. J'ai besoin de votre aide pour une requête
    Par ovdz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2005, 11h42
  3. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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