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

PL/SQL Oracle Discussion :

Optimisation de count(*)


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Optimisation de count(*)
    J'essaie d'optimiser une liste de Requête oracle de type :

    Requête 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select count(*) from a, b, c, d, e, f, g, h,i
    into m1
    where ... 
    mes jointures
    ...
    and  a.c1 = 1
    and d.c2 = 'Z';
    Requête 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select count(*) from a, b, c, d, e, f, g, h,i
    into m2
    where ... 
    mes jointures
    ...
    and  a.c1 = 5
    and d.c2 = 'Y'
    and g.c3 = 'R';
    etc... pour 15 requêtes

    Comment optimiser au mieux ce genre de requêtes, sachant que je vais mettre les résultats obtenus (m1 à m15) dans une table de résultat par un insert.
    Merci d'avance pour votre collaboration.

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,

    Il serait plus simple de te répondre avec les requêtes complètes.
    Mais déjà je peux voir que tu fais des jointures qui ne sont plus à la norme !!
    ( A moins que ton SQBD ne les supporte pas) --> Pense à nous indiquer ton SGBD.

    Il faudrait aussi un explain plan de ta requête.
    ~ Lola ~

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Optimisation
    En fait je ne cherche pas à optimiser le code en tant que tel mais optimiser la façon de faire. Je pense créer une vue qui me ramène mes champs dont j'ai besoin, puis faire mes count(*) dans ma vue. Vais je y gagner en performance ?

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    En supposant que toutes les requêtes sont sur le même modèle, c'est à dire des conditions supplémentaires qu'on rajoute au fur et à mesure, vous pouvez tenter une seule requête du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    SELECT count(*)  as nbRequete1,
               sum ( CASE 
                              WHEN g.c3 = 'R' THEN 1
                              ELSE 0
                        END
                     ) AS nbRequete2, 
                sum ( CASE 
                              WHEN g.c3 = 'R' AND (autre condition) THEN 1
                              ELSE 0
                        END
                     ) AS nbRequete3
               -- etc
    FROM a, b, c, d, e, f, g, h,i
    INTO m1
    WHERE ... 
    mes jointures
    ...
    AND  a.c1 = 1
    AND d.c2 = 'Z';

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    A quoi sert le count(*) ? A t on vraiment besoin de la valeur ou est ce pour un cas du type :

    Si count(*) > 0 alors faire des choses
    sinon faire d'autres choses
    finsi

    Si c'est pour ce genre de besoin alors c'est facilement optimisable, il suffit de ne pas faire count(*).

  6. #6
    Membre confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 247
    Points : 473
    Points
    473
    Billets dans le blog
    1
    Par défaut
    La reponse est dans cette file
    http://www.developpez.net/forums/d11...sieurs-select/

    a adapter bien sur a ton cas :
    Il te faut garder dans le where les jointure communes a toutes tes requetes
    que tu apelle je crois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE ... 
    mes jointures
    ...
    et mettre dans les sum() les conditions particulieres a chaque decompte.

    Apres tu peux EN PLUS preciser les conditions particulieres si elles permettent d'optimiser la requete ( utilisation d'index ... ) dans le where global
    avec des OR
    ou les regrouper sur les criteres les moins discriminants (Rei Ichido )comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AND a.c1 in (1 ,5 )
    AND d.c2 in ('R', 'Z')
    sans mettre g.c3 puisqu'il y a un compte ou un les veut tous ( premere requete )

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    La réponse de Rei Ichido me satisfait tout à fait.
    Merci

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par Jean.Cri1 Voir le message
    ou les regrouper sur les criteres les moins discriminants (Rei Ichido )comme ici :
    Ayant lu hâtivement (c'est mal ) la demande, j'avais interprété la suite de requêtes comme de plus en plus restrictives, sans voir que les conditions changeaient.

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

Discussions similaires

  1. [MySQL] Optimisation requête avec SELECT COUNT
    Par przvl dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/10/2008, 15h27
  2. optimisation count(*) vs count(champs)
    Par oadin dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 21/03/2008, 10h04
  3. [MySQL] Optimiser requete count
    Par oim dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/12/2007, 01h11
  4. [MySQL] Comment optimiser les COUNT ?
    Par DavidDeTroyes dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/04/2007, 18h54
  5. Comment optimiser une Requete avec Count ?
    Par tavarlindar dans le forum Requêtes
    Réponses: 15
    Dernier message: 09/02/2007, 21h19

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