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 :

Explication sur les performances SQL / ROW_NUMBER / COUNT(*) [19c]


Sujet :

SQL Oracle

  1. #1
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut Explication sur les performances SQL / ROW_NUMBER / COUNT(*)
    Bonjour,

    J'aimerais mieux comprendre le fonctionnement d'oracle au niveau des performances.
    Ma question est simple, j'ai la requête ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
        *
    FROM (
        select
            a.*,
            ROW_NUMBER() OVER (ORDER BY a.ID DESC) rn
        from Table a
        where       
            a.STATUS IN('1', '2', '5', '6', '8')
    ) result
    WHERE rn > 0 and rn <= 15
    Cost (%CPU) = 15 (100)
    A présent je change juste un petit truc dans ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
        count(*)
    FROM (
        select
            a.*,
            ROW_NUMBER() OVER (ORDER BY a.ID DESC) rn
        from Table a
        where       
            a.STATUS IN('1', '2', '5', '6', '8')
    ) result
    WHERE rn > 0 and rn <= 15
    Cost (%CPU) = 11585 (1)
    Quelqu'un pourrait m'expliquer ce que oracle fabrique pour prendre 1000 fois plus de CPU pour un simple count et pour afficher 15 ?

    Merci d'avance pour votre aide

  2. #2
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    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 : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Si tu veux savoir ce que fabrique Oracle quand il exécute une requête, il faut récupérer son plan d'exécution.
    Vu que dans tes requêtes il n'y a pas de bind variables, la solution la plus simple est d'afficher le plan d'exécution estimé par l'optimiseur.
    Pour cela, fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET AUTOTRACE ON;
    lancement de ta requête
    SET AUTOTRACE OFF;
    Une fois cela fait, post ici le résultat. Si ce n'est pas plus clair, il faudra afficher le vrai plan d'exécution, pas celui estimé mais c'est un peut plus ardu : un tuto ici
    https://sqlmaria.com/2017/08/08/usin...ecution-plans/

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Par ailleurs le COST n'est pas une métrique comparable entre 2 requêtes :
    Consider Cost or Time - trying to compare the COST of two queries

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 161
    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 161
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Déjà il faudrait donner la version exacte concernée!
    De plus, il faudrait donner les plans d'exécution complets faits en SQL*Plus.

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    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 : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Par ailleurs le COST n'est pas une métrique comparable entre 2 requêtes :
    Consider Cost or Time - trying to compare the COST of two queries
    Tu as parfaitement raison, je ne sais pas pourquoi il s'est focalisé sur le COST mais celui-ci ne sert qu'à comparer, pour un même sql_id, N plans entre eux et à choisir le moins élevé.

  6. #6
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Bonjour à tous,

    Merci pour vos retours.
    Je me suis focalisé sur le cost car je viens d'un monde DB2 à la base et que l'explain n'est pas exactement la même chose.

    Donc si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select /*+ GATHER_PLAN_STATISTICS */
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM TABLE(DBMS_XPLAN.display_cursor(format=>'ALLSTATS LAST +cost +bytes +outline'));
    J'obtiens les vrais résultats d'exécution de la requête ?
    Et si oui que je dois prend en compte ? Le A-Time ?

  7. #7
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    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 : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Oui, tu auras le vrai plan d'exécution avec cette commande.
    Et le A-TIME (Actual time) est mieux que le E-TIME (Estimated time) même si certains te disent qu'il n'est aps fiable à 100% : http://www.dba-oracle.com/t_a_time_execution_plan.htm
    Sinon sous SQL*Plus tu peux faire un
    set timing on
    avant de lancer le SELECT pour afficher le temps total passé sur ton SELECT.

  8. #8
    Membre averti Avatar de rockley
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 404
    Points : 346
    Points
    346
    Par défaut
    Un grand merci à tous pour votre aide.
    Le temps d'exécution du count(*) est en fait très acceptable

    Je me suis fait avoir par le COST sans savoir que c'était juste une estimation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur les performance d'une transaction SQL
    Par SlashEne dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 24/04/2008, 23h41
  2. [RegEx] preg_replace : explications sur les caractères spéciaux
    Par Anduriel dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2005, 22h35
  3. Votre avis sur les performances
    Par Rafy dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 12/08/2005, 09h28
  4. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 14h49
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 23h18

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