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
Version imprimable
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
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.
Je n'avais jamais vu ça non plus, mais sur la doc, une personne (Philip Stoev : QA Engineer chez MySQL) à ajouter une note :
source : http://dev.mysql.com/doc/refman/5.0/...functions.htmlCitation:
COUNT(*) is internally converted to COUNT(0), however any other number or string produce the same result.
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.
Okay.
Merci pour vos réponses.
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 :aie:
Un exemple que j'adore.
Citation:
Envoyé par Jacques a dit
Voilà je vais donc employer COUNT(PK).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)
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 :-)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 | | | | ------------------------------------------------------------------------------
Bravo pour le test :fessee: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.
COUNT(*) est toujours le même que COUNT(0)
Ce n'est pas parcequ'Oracle a acheter MySQL qu'il faut tout mélanger :aie:Citation:
QA Engineer chez MySQL)
Oui mais tu n'as pas été assez loin dans ton test pour en tirer une conclusion :
PS : Je soupsonne que ce post a été déplacé du forum de mysql vers celui d'oracle d'où les allusions à mysql.Code:
1
2
3
4
5
6
7 mysql> select count(*); +----------+ | count(*) | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
Sinon très bon le coup du bitmap laurent :ccool:
ok, désolé pour la fessée, je ne connais rien à mysql...
:lol: Désolé autant pour moi dans ce cas ;)