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
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.htmlCOUNT(*) 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(*)
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.
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.
Envoyé par Jacques a dit
Voilà je vais donc employer COUNT(PK).
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)
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 : 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 | | | | ------------------------------------------------------------------------------
Bravo pour le testApres 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élangerQA Engineer chez MySQL)![]()
Partager