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 :

différence entre count(*) et count(1)


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut différence entre count(*) et count(1)
    bonjour,

    je voudrais connaître la différence entre le count(*) et le count(1), d'après ce qu'on m'a dit que c'est mieux d'utiliser le count(1) pour des raisons de perfermance car le count (*) remente tous les champs en mémoire

    merci

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Non c'est faux. Cela revient au même. Ce qui est différent en matière de perf c'est select * ou select 1.

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut
    d'accord merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Bonsoir,

    s'il y a une clé primaire sur la table (ou un index unique), il faut faire un count sur la pk.
    On aura un balayage que sur l'index(au lieu de la table).
    Mais c'est vrai que count(*) ou count(1) ne prendra pas l'index.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create table test(tst_number number(6), tst_varchar varchar2(200));
    create unique index tst_ndx on test(tst_number);
    select /*+index(test tst_ndx)*/ count(tst_number) from test;
    Cdt

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Une instruction "select count(*) ..." peut utiliser un index sans avoir à forcer l'utilisation de l'index par un hint:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    dev001> set autot off
    dev001>
    dev001> select * from v$version;
     
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
    PL/SQL Release 10.2.0.2.0 - Production
    CORE    10.2.0.2.0      Production
    TNS for 32-bit Windows: Version 10.2.0.2.0 - Production
    NLSRTL Version 10.2.0.2.0 - Production
     
    dev001>
    dev001> drop table t;
     
    Table dropped.
     
    dev001>
    dev001> create table t
      2  (c1 int primary key,
      3   c2 varchar2(100)
      4  );
     
    Table created.
     
    dev001>
    dev001>
    dev001> begin
      2  for i in 1.. 10000
      3  loop
      4  insert into t
      5  values (i, to_char(i));
      6  end loop;
      7  commit;
      8  end;
      9  /
     
    PL/SQL procedure successfully completed.
     
    dev001> show errors
    No errors.
    dev001>
    dev001> exec dbms_stats.gather_table_stats(ownname => 'TEST', tabname => 'T', cascade => true);
     
    PL/SQL procedure successfully completed.
     
    dev001>
    dev001> set autot traceonly explain
    dev001> select count(*) from t;
     
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1282900848
     
    -----------------------------------------------------------------------------
    | Id  | Operation             | Name        | Rows  | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |             |     1 |     5   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE       |             |     1 |            |          |
    |   2 |   INDEX FAST FULL SCAN| SYS_C003048 | 10000 |     5   (0)| 00:00:01 |
    -----------------------------------------------------------------------------

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Bien vu.

    Je ne n'avais jamais fait attention que le count(*) ne fonctionne qu'avec une pk.

    Merci

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. compteur d'entrée avec SELECT count(*)
    Par pipip dans le forum Langage
    Réponses: 4
    Dernier message: 24/10/2010, 16h48
  3. différence entre count et sum
    Par canary dans le forum Langage SQL
    Réponses: 2
    Dernier message: 22/06/2009, 09h35
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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