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

MS SQL Server Discussion :

optimisation count(*) vs count(champs)


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut optimisation count(*) vs count(champs)
    Bonjour,

    J'ai fait qq recherches sur internet et je n'ai rien trouvé de très concret a ce sujet.

    Quel est la requète la plus performante entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*) from machin
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(champs) from machin
    .
    De même avec la fonction exists(select *) et exists(select champs)

    Si je respecte ce que je faisais avant, et ce que j'ai pu lire le * est plus performant. Je prendrais comme référence Joe Celko qui indique dans sql avancé que le * permet a l'optimiseur de choisir le champs qu'il a envie.

    Petit soucis, un consultant sql server s'est rendu il y a qq temps a la société ou je travaille et lui dit qu'il vaut mieux prendre un champs pour ne pas qu'il prenne une ligne entière.
    Ce n'est pas que je refuse de lui faire confiance, mais un peu qd même. Et par ailleurs ça ne m'amuse guère de changer tout mes *.

    Ma question est donc, sur ce que vous en savez ou en avez lu pour microsoft Sql Server lequel des deux est le plus performant selon vous?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Réponse facile, les deux explications sont bonnes.

    Faire un count(champs) est utile quand on maîtrise les index de sa table. En effet, effectuer un count sur un champ indexé accélère l'exécution de la requête.

    Dans le cas où on n'a pas connaissance de la structure d'indexation des tables, le count(*) permet au moteur d'effctuer un travail d'analyse et d'optimisation. Mais pour être efficace, il faut cette requête soit fréquement exécuté. Plus elle est exécutée plus le moteur est efficace.

    Donc il s'agit plus d'un choix de dépendances des performances. Surtout si les indexs des tables sont amenés à évoluer. J'espère avoir amené un petit peu d'eau à ton moulin.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Par défaut
    oui en tout cas ça confirme ce que je pensais sur le sujet.
    Je comprends pas pk le consultant nous en a parler comme si c'était un sacrilège

  4. #4
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    je suis d'accord avec Madinico.

    en revanche, fais attention avec les pk composées.
    il arrive que pour des soucis de réindexation et de purge on créé des tables du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table t1
    (t_id int identity(1,1) not null,
    nom varchar(50),
    prénom1 varchar(50),
    prénom2 varchar(50),
    ...
    où l'on met la pk sur le champ t_id pour avoir un "ordre" d'insertion et donc de purge plus tard alors que le vrai pk aurait du être (nom,prénom1,prénom2)

    si tu veux des explications plus poussées, regarde dans le forum Oracle, car sous Oracle une PK est d'abord un index unique.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Petit soucis, un consultant sql server s'est rendu il y a qq temps a la société ou je travaille et lui dit qu'il vaut mieux prendre un champs pour ne pas qu'il prenne une ligne entière.
    Alors ça doit être un con sultant (en deux mots) ! ;-)

    Evidemment le count(*) est plus rapide qu'un count(colonne). De plus ce consultant ne sait sans doutes pas que certaines tables système contiennent le nombre des lignes de la table et que c'est encore plus rapide de faire une requête dans ce genre de table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select rowcnt from sysindexes where id = OBJECT_ID(MaTable)
    Cela dit cette valeur n'est pas toujours garantie...
    A lire : http://www.dbforums.com/showthread.php?t=761787

    Bref, mieux vaut engager un bon consultant (en un seul mot) et comme moi, par exemple - comme ça je me fais de la pub !!! - qu'un mauvais con sultant en deux mots... Même si c'est plus cher au coût de journée, le bon reviendra moins cher au final, en évitant de dire des bêtises et donc en évitant de revenir deux fois sur les mêmes choses...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/11/2012, 19h43
  2. Deux count sur même champ avec conditions différentes
    Par steerayInFrance dans le forum Développement
    Réponses: 4
    Dernier message: 14/06/2011, 14h20
  3. Réponses: 2
    Dernier message: 03/12/2009, 23h10
  4. count sur plusieurs champs
    Par olibara dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/06/2009, 23h23
  5. Count sur un champ
    Par julien2602 dans le forum PL/SQL
    Réponses: 4
    Dernier message: 13/08/2008, 13h41

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