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 :

A quoi sert le count(1)


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 41
    Points
    41
    Par défaut A quoi sert le count(1)
    Bonjour,

    je voudrais savoir a quoi sert le count(1) puisque le count(*) renvoie la meme chose ?

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    Par défaut
    Bonjour,

    C'est la même chose, même plan d'exécution et utilisation d'index.
    Cependant, et là je ne parle que de mon expérience perso, je ne parles pas de vérité universelle (je vous vois venir là ) je sais que certaines personnes ont l'habitudes d'utiliser le count(1) quand ils veulent simuler la clause "EXIST" !

    Il y a eu une rumeur qui disait que count(1), sur les anciennes versions d'Oracle, fonctionnait de manière plus opti aussi

    Bisous bisous

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Ca fait partie des mythes qui persistent (comme le mythe du bulk collect) consistant à croire que count(1) est plus efficace que count(*), alors qu'en fait c'est exactement la même chose.

  4. #4
    Membre du Club
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Je ne parle pas de si c'est plus rapide ou plus lent, je veux juste comprendre l'utilité, que represente le 1 dans count(1) ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    1 représente l'expression que tu comptes. count(1) va donc compter le nombre de lignes pour lesquelles 1 n'est pas NULL. Puisque 1 n'est pas NULL, c'est exactement la même chose que count(0), count(2).. ou count(*).
    Le seul intérêt de mettre count(expr) au lieu de count(*) est si tu veux ignorer les lignes pour lesquelles expr est NULL (typiquement ici expr sera une colonne).

  6. #6
    Inactif  

    Homme Profil pro
    Freelance EURL / Business Intelligence ETL
    Inscrit en
    Avril 2005
    Messages
    5 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance EURL / Business Intelligence ETL
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2005
    Messages : 5 879
    Points : 26 147
    Points
    26 147
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par lepierot
    Je ne parle pas de si c'est plus rapide ou plus lent, je veux juste comprendre l'utilité


    Bah on t'a dit la réponse, si tu croises ça dans un script, c'est que le quidam qui l'a développé est persuadé qu'il aura son résultat plus vite... c'est ça l'utilité.
    - So.... what exactly is preventing us from doing this?
    - Geometry.
    - Just ignore it !!
    ****
    "The longer he lived, the more he realized that nothing was simple and little was true" A clash of Kings, George R. R. Martin.
    ***
    Quand arrivera l'apocalypse, il restera deux types d'entreprise : les pompes funèbres et les cabinets d'audit. - zecreator, 21/05/2019

  7. #7
    Membre du Club
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Mai 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Mai 2006
    Messages : 166
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    1 représente l'expression que tu comptes. count(1) va donc compter le nombre de lignes pour lesquelles 1 n'est pas NULL. Puisque 1 n'est pas NULL, c'est exactement la même chose que count(0), count(2).. ou count(*).
    Le seul intérêt de mettre count(expr) au lieu de count(*) est si tu veux ignorer les lignes pour lesquelles expr est NULL (typiquement ici expr sera une colonne).
    Merci Vanagreg, ton explication est parfaite pour moi.

  8. #8
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Le seul intérêt de mettre count(expr) au lieu de count(*) est si tu veux ignorer les lignes pour lesquelles expr est NULL (typiquement ici expr sera une colonne).
    ATTENTION : il ne faut pas que la colonne dans count(colonne) soit en NOT NULL sinon ce filtrage sur les valeurs NULL ne marchera pas.

    Et puis, sauf erreur de ma part, select count(*) est remplacé par Oracle par un select count(pk): il optimise de lui même l'expression en la réécrivant.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Oui évidemment si on compte sur une colonne NOT NULL ça reviendra au même que faire count(*).

  10. #10
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Ca fait partie des mythes qui persistent (comme le mythe du bulk collect)
    C'est quoi ce mythe?
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Penser que l'insertion/la mise à jour en masse de données sera plus efficace si on utilise du bulk collect.

    https://asktom.oracle.com/pls/apex/f...10800346068768
    https://blog.dbi-services.com/how-to...-plsql-vs-sql/

    Alors qu'il faut simplement faire du SQL pur. Nettement plus rapide et scalable. D'autant plus qu'en Entreprise Edition on bénéficie du parallélisme natif. Un peu dommage de s'en priver pour faire tout en PGA, avec des changements de contexte PL/SQL-SQL.

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    De mémoire sur les versions d'Oracle d'il y a une vingtaine d'années (v7 / v8), Oracle créait une colonne virtuelle composée de 1 puis en faisait le décompte.
    Ça posait des problèmes de performances inutiles, donc ils ont fini par traduire count(1) en count(*).

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    ATTENTION : il ne faut pas que la colonne dans count(colonne) soit en NOT NULL sinon ce filtrage sur les valeurs NULL ne marchera pas.
    Pas du tout d'accord. Au contraire même. Si on fait une jointure externe et qu'on compte une colonne NOT NULL de la table jointe, on sait précisément quel est le comptage des données où la jointure a été effectué vs le comptage global.
    Si on fait le comptage sur une colonne "NULLABLE", on ne sait pas si c'est parce que la jointure n'a pas été faite ou si ce sont les données qui sont nulles.

    Le mieux c'est de comprendre comment fonctionne la fonction et de l'utiliser à bon escient.

  14. #14
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Ce que je disais c'est qu'on ne verra pas l'exécution du filtre des "valeurs" NULL si la colonne est en NOT NULL.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  15. #15
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Pour revenir à la question initiale, je viens de faire un test.
    Je crée une table, j'insère un enregistrement avec NULL dans toutes les colonnes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(col1) from maTable  --> résultat = 0
    select count(1)  from maTable  --> résultat = 1
    select count(*) from maTable  --> résultat = 1
    Pour les 2 premiers essais, je n'avais aucun doute. Mais j'ai voulu tester pour le 3ème Select. Et comme la valeur renvoyée est 1, ça confirme que Oracle ne va pas chercher les données elles-mêmes si ce n'est pas nécessaire.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  16. #16
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Le plus détaillé est d'afficher l'explain plan d'un count(*) sur une grosse table avec pas mal d'indexes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM TCLIENT
    Plan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT STATEMENT  ALL_ROWSCost: 171  Cardinality: 1  		
    	2 SORT AGGREGATE  Cardinality: 1  	
    		1 INDEX FAST FULL SCAN INDEX TCLIENT_FK_PARTENAIRE Cost: 171  Cardinality: 312 K
    CLIENT_FK_PARTENAIRE est un index pour foreign key
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX TCLIENT_FK_PARTENAIRE ON TCLIENT (SOCIETE, PARTENAIRE)
    PK de TCLIENT : SOCIETE, MAGASIN, CLIENT
    TCLIENT.PARTENAIRE : NULL autorisé (et contient des données NULL), mais la première colonne de l'index étant SOCIETE, il y a toujours une ligne dans l'index par ligne dans TCLIENT


    Oracle prend donc l'index qu'il souhaite (le plus petit j'imagine) dont il est sûr qu'il contient bien une entrée par ligne de la table
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 09h52
  2. à quoi sert le délestage?
    Par r0d dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 06/10/2004, 14h34
  3. a quoi sert le schema dans postgres ??
    Par champion dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 13/09/2004, 10h25
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/03/2004, 17h20

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