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 :

Optimisation d'une requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Par défaut Optimisation d'une requête
    Bonjour,

    J'ai créé une requete sql, mais elle me semble un peu lourde à l'exécution, je me demandais si il en existait une forme "optimisée".
    Cette requete sera exécutée en shell.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select a,b,(a/b*100) from (((select count(*) as a from drive where argument = 'OK') ra), ((select count(*) as b from drive) rb))
    Merci d'avance

  2. #2
    Scorpi0
    Invité(e)
    Par défaut
    Bonjour,

    Commence par bien indenter a requête !!

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Par défaut
    OK je vais tenter d'indenter ma requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select a,b,(b/a*100) from(
         ((select count(*) as b FROM centreon.host WHERE host_register = "1") ra),
         ((select count(*) as a from centreon.host) rb)
    )

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Ca n'est pas étonnant que ce soit lourd : tu n'as pas de jointure entre tes 2 sous-requêtes ra et rb, donc tu fais un produit cartésien.
    Pour être lourd, ça doit être du très lourd, même pas besoin d'avoir des tables très volumineuses, et en plus fonctionnellement ça n'a certainement aucun sens !

  5. #5
    Scorpi0
    Invité(e)
    Par défaut
    Le produit cartésien ne se fait que sur 2 tables d'une ligne, rien de bien méchant donc.

    Pas moins lourd mais plus joli je trouve :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with 
    t1 as (select count(*) as a from drive),
    t2 as (
            select count(*) as b
            from drive 
            where argument = 'OK'
          ) 
    select a, b, (a/b)*100
    from t1, t2
    Une question de gout ^^
    Tu as combien de ligne dans ta table ? Quel proportion de argument = 'OK' ?


    Une autre idée, si ça te dérange pas d'avoir ton résultat en lignes plutôt qu'en colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(1), decode(argument, 'OK', 'OK', 'NOT OK')
    from drive 
    group by decode(argument, 'OK', 'OK', 'NOT OK')
    Dernière modification par Scorpi0 ; 10/09/2008 à 15h46.

  6. #6
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 39
    Par défaut
    Dans ma table je dois avoir dans les 20 lignes.

    Et la proportion d'état "OK", un maximum j'espère, sauf gros soucis technique...


    Citation Envoyé par dgi77 Voir le message
    Ca n'est pas étonnant que ce soit lourd : tu n'as pas de jointure entre tes 2 sous-requêtes ra et rb, donc tu fais un produit cartésien.
    Pour être lourd, ça doit être du très lourd, même pas besoin d'avoir des tables très volumineuses, et en plus fonctionnellement ça n'a certainement aucun sens !
    Merci de l'information, mais si je post ici, c'est que j'ai bien conscience du problème. Je ne cherche pas des critiques, mais plutôt des conseils. Donc si suite à ta jolie démonstration de la nullité de ma requete tu avais également quelques solutions à proposer, je suis également preneur.

  7. #7
    Scorpi0
    Invité(e)
    Par défaut
    Pour remettre en lignes la requête que je t'ai postée au dessus, tu peux faire un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with myTable as
    (
      select count(1) as n, decode(argument , 'OK', 'OK', 'NOT OK') as etat
      from drive 
      group by decode(argument , 'OK', 'OK', 'NOT OK')
    )
    select nOK, nNOTOK, nOK/nNOTOK*100
    from
    (
      select distinct (select n from myTable where etat = 'OK') as nOK, 
                 (select n from myTable where etat = 'NOT OK') as nNOTOK
      from myTable
    )
    Y'a des fonctions pivots à partir d'Oracle 11g, mais ça je connais pas encore ^^

    Au final, si ta table ne fait que 20 lignes et n'est pas destinée à en contenir plus, ta toute première requête devrait largement suffire. Tu te poses pas des questions pour optimiser des requête qui tape 20 lignes.
    Si tu trouves ton temps d'exécution trop lent, le problème doit venir d'ailleurs.

  8. #8
    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 mitou Voir le message
    Dans ma table je dois avoir dans les 20 lignes.
    Si en exécutant une requête sur 20 lignes tu as déjà des soucis de perfs, le problème vient surement d'ailleurs

    Tu n'utiliserais pas un site web ou excel ou autre pour voir le résultat plutôt que SQL*Plus ?

Discussions similaires

  1. Optimisation d'une requête
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/12/2005, 18h21
  2. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 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