Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/08/2011, 13h22   #1
Invité de passage
 
Inscription : avril 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 16
Points : 1
Points : 1
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
corro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 13h43   #2
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
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.
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 13h48   #3
Modérateur
 
Avatar de Golgotha
 
Homme cédric
Développeur informatique
Inscription : août 2007
Messages : 732
Détails du profil
Informations personnelles :
Nom : Homme cédric
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2007
Messages : 732
Points : 1 562
Points : 1 562
Envoyer un message via Skype™ à Golgotha
Je n'avais jamais vu ça non plus, mais sur la doc, une personne (Philip Stoev : QA Engineer chez MySQL) à ajouter une note :

Citation:
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
__________________
modérateur webmasters - développements web & php
faq jQuery - règles du forum - faqs web
mon espace perso
Venez participez au deuxième defi Web !
Golgotha est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/08/2011, 14h05   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 813
Points : 5 813
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(*)
Citation:
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.

mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 14h16   #5
Invité de passage
 
Inscription : avril 2007
Messages : 16
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 16
Points : 1
Points : 1
Okay.
Merci pour vos réponses.
corro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 15h05   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
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.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 17h38   #7
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
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 :
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 :
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 :-)

Citation:
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)


Citation:
QA Engineer chez MySQL)
Ce n'est pas parcequ'Oracle a acheter MySQL qu'il faut tout mélanger
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/08/2011, 18h21   #8
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
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
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 19h20   #9
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 14h36   #10
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 926
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 926
Points : 4 547
Points : 4 547
ok, désolé pour la fessée, je ne connais rien à mysql...
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2011, 22h13   #11
Rédacteur/Modérateur
 
Avatar de David55
 
Homme David S.
Etudiant en alternance
Inscription : août 2010
Messages : 1 167
Détails du profil
Informations personnelles :
Nom : Homme David S.
Âge : 22
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Etudiant en alternance
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2010
Messages : 1 167
Points : 2 304
Points : 2 304
Désolé autant pour moi dans ce cas
__________________
Vous trouverez ma page perso avec des tutoriels sur Android et BIRT au lien suivant : http://dsilvera.developpez.com
N'oubliez pas de voter pour les messages dont la réponse est pertinente (en bas à droite du cadrant)
Vous voulez afficher du code :
Votre problème est résolu :
Pas de question technique par MP !
David55
David55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h07.


 
 
 
 
Partenaires

Hébergement Web