Quelquun peut-il me dire la différence entre select count (*) et count (1) dans le serveur SQL?


Meilleure réponse

Il y a déjà de bonnes réponses ici, mais malheureusement, certains sont faux.

Le 1 dans COUNT (1) est juste une expression constante littérale, il na rien à voir avec la colonne 1 du tableau. Il donnera la même réponse que COUNT (*), et a le même plan dexécution. La requête comptera les lignes du plus petit index non clusterisé pour minimiser les E / S requises.

COUNT (Col) (pour une colonne Nullable) sera trouvé en comptant les lignes dans le plus petit index qui inclut Col, sil ne figure dans aucun index, une analyse de table est nécessaire. Si Col est dans la clé ou lindex clusterisé, il fait également partie de tous les autres index, donc le plus petit index non clusterisé sera analysé plutôt quune analyse de table groupée.

Si la colonne ciblée nest PAS NULL, alors COUNT (Col) est identique à COUNT (*) et sera à nouveau trouvé en scannant le plus petit index non clusterisé, même si Col ne se trouve dans aucun index.

Ces instructions sont basées sur des plans dexécution estimés de diverses requêtes sur un serveur SQL 2014, les optimiseurs de requêtes pour les versions plus anciennes ou plus récentes peuvent fonctionner différemment. Vous constaterez peut-être quapprendre à lire les plans dexécution peut vous en apprendre beaucoup plus sur la façon dont les requêtes sont exécutées que dessayer de déterminer quelle réponse publiée ici est la plus précise.

Réponse

Le paramètre à la fonction COUNT est une expression qui doit être évaluée pour chaque ligne. La fonction COUNT renvoie le nombre de lignes pour lesquelles lexpression évalue une valeur non nulle. (* est une expression spéciale qui nest pas évaluée, elle renvoie simplement le nombre de lignes.)

Il y a deux modificateurs supplémentaires pour lexpression: ALL et DISTINCT. Ceux-ci déterminent si les doublons sont supprimés. Puisque ALL est la valeur par défaut, votre exemple est le même que count (ALL 1), ce qui signifie que les doublons sont conservés.

Puisque lexpression «1» est évaluée comme non nulle pour chaque ligne, et puisque vous ne suppriment pas les doublons, COUNT (1) doit toujours renvoyer le même nombre que COUNT (*).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *