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 :

Une question sur le count


Sujet :

SQL Oracle

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Par défaut Une question sur le count
    Bonjour,

    J'ai vu dans une requete un select count(0), etc..

    Est ce que quelqu'un saurait ce que count(0) signifie exactement ?

    Merci par avance

  2. #2
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Apres testes, ceci a l'air de faire la même chose qu'un count(*) sauf que lorsqu'il n'y a aucune ligne cela affiche 1.

  3. #3
    Membre extrêmement actif
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 387
    Billets dans le blog
    1
    Par défaut
    Je n'avais jamais vu ça non plus, mais sur la doc, une personne (Philip Stoev : QA Engineer chez MySQL) à ajouter une note :

    COUNT(*) is internally converted to COUNT(0), however any other number or string produce the same result.
    source : http://dev.mysql.com/doc/refman/5.0/...functions.html
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Avec Oracle, Count(0) c’est un peu de n’importe quoi utilisé par le gens qui sont convaincu qu’il plus performant que count(*)
    COUNT({ * | [ DISTINCT | ALL ] expr })
    [ OVER (analytic_clause) ]


    Purpose

    COUNT returns the number of rows returned by the query. You can use it as an aggregate or analytic function.

    If you specify DISTINCT, then you can specify only the query_partition_clause of the analytic_clause. The order_by_clause and windowing_clause are not allowed.

    If you specify expr, then COUNT returns the number of rows where expr is not null. You can count either all rows, or only distinct values of expr.

    If you specify the asterisk (*), then this function returns all rows, including duplicates and nulls. COUNT never returns null.


  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 29
    Par défaut
    Okay.
    Merci pour vos réponses.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Avec Oracle, Count(0) c’est un peu de n’importe quoi utilisé par le gens qui sont convaincu qu’il plus performant que count(*)
    C'est devenu la légende urbaine des dbas.
    Il me semble cependant que c'était vraiment plus efficace sur les vieilles version d'Oracle (<7).
    Ce n'est plus le cas maintenant.

  7. #7
    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
    Par défaut
    alors pour rejouter au mythe :

    Il était une fois un rule base optimiseur qui ne faisait que ce qu'on lui demandait.

    /*+INDEX*/ --> utilise un index
    /*+FULL*/ --> fait un full table scan
    COUNT(*) --> conte les lignes
    COUNT(col1) --> conte le nombre de lignes ou col1 n'est pas nulle
    COUNT(0) --> conte le nombre de lignes ou l'expression 0 n'est pas nulle

    Bien sûr les seuls clowns qui faisaient du COUNT(0) ou du COUNT(1) sont ceux qui écoutaient ce que leurs chefs disaient et ne remettait rien en question pour ne pas avoir l'air idiot. COUNT(*) était parfois beaucoup plus performant. Mais souvent à peu près pareil à un COUNT(0) ou à un comme SUM(1) ou à un count(*)+0 si on veut.

    Plus tard, en 7.3, 8, 9, 10, 11 etc, Oracle a rendu ces bases plus performantes en corrigeant secrètements ces défaut de la pensée

    Un exemple que j'adore.

    Citation Envoyé par Jacques a dit
    COUNT(*) est lent parcqu'il compte toute les colonnes. Il faut employer COUNT(PRIMARYKEY).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create table t(pk raw(16) constraint t_pk primary key, y number not null);
    create bitmap index t_b on t(y);
    insert into t select sys_guid(),1 from dual connect by level<1001 ;
    commit;
    exec dbms_stats.gather_table_stats(user,'T',cascade=>true)
    Voilà je vais donc employer COUNT(PK).
    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
    select count(pk) from t;
     COUNT(PK)
    ----------
          1000
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 2332936558
    ------------------------------------------------------------------------------
    | Id  | Operation                     | Name | Rows  | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT              |      |     1 |     1   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE               |      |     1 |            |          |
    |   2 |   BITMAP CONVERSION COUNT     |      |  1000 |     1   (0)| 00:00:01 |
    |   3 |    BITMAP INDEX FAST FULL SCAN| T_B  |       |            |          |
    ------------------------------------------------------------------------------
    Oh surprise! Oracle sait bien que compter toutes les occurences d'une colonne non-nulle (ou d'une expression 0, 1, 'titi et grosminet') reviens à faire un COUNT(*). Ensuite, bien que tu aies du COUNT(PK), oracle choisis le plus petit index :-)

    Apres testes, ceci a l'air de faire la même chose qu'un count(*) sauf que lorsqu'il n'y a aucune ligne cela affiche 1.
    Bravo pour le test
    COUNT(*) est toujours le même que COUNT(0)


    QA Engineer chez MySQL)
    Ce n'est pas parcequ'Oracle a acheter MySQL qu'il faut tout mélanger

  8. #8
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    alors pour rejouter au mythe :

    Bravo pour le test
    COUNT(*) est toujours le même que COUNT(0)

    J'ai juste constaté! Voici ce que j'ai fait:

    Et ceci m'a renvoyé 1. C'est tout

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par David55 Voir le message
    J'ai juste constaté! Voici ce que j'ai fait:

    Et ceci m'a renvoyé 1. C'est tout
    Oui mais tu n'as pas été assez loin dans ton test pour en tirer une conclusion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mysql> select count(*);
    +----------+
    | count(*) |
    +----------+
    |        1 |
    +----------+
    1 row in set (0.00 sec)
    PS : Je soupsonne que ce post a été déplacé du forum de mysql vers celui d'oracle d'où les allusions à mysql.
    Sinon très bon le coup du bitmap laurent

  10. #10
    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
    Par défaut
    ok, désolé pour la fessée, je ne connais rien à mysql...

  11. #11
    Rédacteur
    Avatar de David55
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Août 2010
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 1 542
    Par défaut
    Désolé autant pour moi dans ce cas

Discussions similaires

  1. [VxiR2] Une question sur count()
    Par EmmanuelleC dans le forum Designer
    Réponses: 1
    Dernier message: 15/06/2011, 14h41
  2. une question sur les includes comportement bizard
    Par e-m.guillaume dans le forum Langage
    Réponses: 2
    Dernier message: 24/02/2006, 21h12
  3. une question sur le code ASP-Nuke
    Par ghita269 dans le forum ASP
    Réponses: 1
    Dernier message: 14/01/2006, 09h41
  4. Une question sur le wap
    Par fabiofabio dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 19/11/2005, 16h24
  5. Encore une question sur malloc
    Par IG88 dans le forum C
    Réponses: 5
    Dernier message: 23/06/2004, 15h35

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