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 :

Quelle est la meilleure maniere de faire une count?


Sujet :

Administration Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut Quelle est la meilleure maniere de faire une count?
    Bonjour,

    j'aurais voulu savoir quel était la meilleure solution pour faire un count dans une table.
    Est-ce le count(*)? count(1)? count(PrimaryKey)?

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ça n'a aucune importance

    Moi j'aime bien mettre le nom de la colonne qui m'intéresse et si c'est les lignes sans que la colonne importe alors je mets 1... mais tu peux mettre ce que tu veux

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    donc y'a pas de meilleure performance avec count(PrimaryKey) plutot que count(*)? 1 DBA y'a quelques années m'avait fait modifier toutes mes lignes de codes pour remplacer les count(*) par des count sur la Primary Key.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    mais les versions d'Oracle évolue et l'optimiseur avec Il me semble que ça n'a plus d'importance au moins depuis la 8i

  5. #5
    Invité
    Invité(e)
    Par défaut
    C'est depuis la version 8i (peut-être même avant, mais je suis moins sûr de mon coup...) que l'optimiseur s'arrange avec le count( ???? ) et passe outre ce qu'il y a entre parenthèse.
    Mais avant, c'est sûr qu'il fallait faire attention !

  6. #6
    Membre confirmé
    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
    Points : 639
    Points
    639
    Par défaut
    On dit toujours que le COUNT(*) est un peu plus lent...

    Par contre, attention : un COUNT sur une colonne ne compte pas les enreg. dont la colonne en question vaut null !
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  7. #7
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    La meilleure solution est ne pas faire un count du tout.
    Quelle est la raison pour ça?

    DAB

  8. #8
    Membre confirmé
    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
    Points : 639
    Points
    639
    Par défaut
    OK, mais qu'est-ce que tu proposes ?
    Des chercheurs qui cherchent, on en trouve, mais des chercheurs qui trouvent, on en cherche !

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    On dit toujours que le COUNT(*) est un peu plus lent...
    et ce n'est pas fondé : http://asktom.oracle.com/pls/asktom/...:1156159920245

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par DAB.cz Voir le message
    La meilleure solution est ne pas faire un count du tout.
    Quelle est la raison pour ça?

    DAB
    probablement un COUNT avec GROUP BY parce que GROUP BY fait du tri

    Sinon, pas de souci

  11. #11
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Peut-être l'order suivant suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 1 from dual where exists (select 1 from matable)
    Si le count est inévitable, j'utiliserais count (1), mais je crois "count (*)" et "count (pk)" sont les mêmes (10g). En cas de lenteur inadmissible, on peut estimer (de max. PRIMARY valeur par ex.) ou tenir la valeur (selectée une fois) pour la session ou .....

    DAB

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DAB.cz Voir le message
    Si le count est inévitable, j'utiliserais count (1), mais je crois "count (*)" et "count (pk)" sont les mêmes (10g).
    C'est exactement la même chose depuis la version 8i !! Cf le lien vers asktom ci-dessus !

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par DAB.cz Voir le message
    Peut-être l'order suivant suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select 1 from dual where exists (select 1 from matable)
    ce n'est pas du tout un compte dans ce cas... pour un test d'existence c'est parfait mais si c'est bien le nombre de lignes dont on a besoin le COUNT est indispensable

  14. #14
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    oui oui, mais on peut souvent voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count (1) into xcn from matable;
    if xcn > 0 then
      ...
    (La meilleure solution est ne pas faire un count du tout.)

    DAB

  15. #15
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par dgi77 Voir le message
    On dit toujours que le COUNT(*) est un peu plus lent...
    on disait aussi que la terre était plate il y a qq temps...

    Non, c'est le contraire, dans le pire des cas, COUNT(*) est aussi rapide que count(primarykey) voire COUNT(1), mais le plus efficace et le plus logique est COUNT(*),

    Il n'existe à ce jour aucun exemple d'une expression différente et plus rapide que COUNT(*)

  16. #16
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Jerome_Mtl Voir le message
    C'est exactement la même chose depuis la version 8i !! Cf le lien vers asktom ci-dessus !
    c'est assez juste car l'optimiseur reconnait les expressions equivalentes à count(*), à savoir COUNT(not_null_expression).

    OCM Grégory Guillou a cependant trouvé un exemple en 11g où il vallait mieux employer count(*) ;-)

    http://www.pythian.com/blogs/627/ora...unt-and-count1

  17. #17
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Selon la régle qui veut qu'une version d'Oracle ne doit pas être installé avant la 2° release, je pense qu'on va attendre la 11.2 avant de tirer des conclusions

    Ceci étant dit, l'exemple est pour le moins étrange... la logique aurait voulu (selon moi ) qu'une vue qui référence des colonnes d'une table soit invalidé quand la table change et pas une vue qui ne compte que les lignes sans se soucier des colonnes... Oracle a ses raisons que la raison n'a pas

  18. #18
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    pour démontrer le non-sens de COUNT(PK), voici un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> create table t(pk, n, c) as select rpad(rownum,4000,'x'),0, 
        to_clob(rpad(rownum,4000,'x')) from all_objects where rownum<=1000;
    Table created.
    SQL> create index pk on t(pk);
    Index created.
    SQL> create index n on t(n);
    Index created.
    SQL> alter table t add primary key(pk);
    Table altered.
    SQL> alter table t modify (n not null);
    Table altered.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SQL> set autotrace on
    SQL> select count(pk) from t;
     COUNT(PK)
    ----------
          1000
    Execution Plan
    ----------------------------------------------------------------------
    | Id  | Operation             | Name | Rows  | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |      |     1 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE       |      |     1 |            |          |
    |   2 |   INDEX FAST FULL SCAN| N    |   921 |     3   (0)| 00:00:01 |
    ----------------------------------------------------------------------
    Comme on le voit, COUNT(PK) n'utilise pas le gros index PK varchar2(4000) de la clé primaire mais bien le petit index N number. Donc COUNT(PK) est identifié comme un count(*) et traduit par l'optimiseur.


  19. #19
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Ceci étant dit, l'exemple est pour le moins étrange... la logique aurait voulu (selon moi ) qu'une vue qui référence des colonnes d'une table soit invalidé quand la table change et pas une vue qui ne compte que les lignes sans se soucier des colonnes... Oracle a ses raisons que la raison n'a pas
    Oui, Oracle aura dû constater que 1 était une expression non-nulle et ainsi le traduire en *

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Points : 341
    Points
    341
    Par défaut
    bon ba merci à tous pour vos réponses

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 16
    Dernier message: 18/08/2008, 18h29
  2. Réponses: 3
    Dernier message: 11/06/2008, 16h47
  3. Réponses: 6
    Dernier message: 17/05/2007, 13h36
  4. Réponses: 2
    Dernier message: 19/03/2007, 16h41
  5. Réponses: 3
    Dernier message: 09/05/2006, 15h16

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