Count(*) vs Count(Id) dans sql server 2005
J'utilise SQL COUNT
fonction pour obtenir le nombre total ou les lignes d'une table. Quelle est la différence entre les deux énoncés suivants?
SELECT COUNT(*) FROM Table
et
SELECT COUNT(TableId) FROM Table
Aussi, est-il une différence en termes de performances et de temps d'exécution?
- Déjà répondu, mais assez bonne discussion à ce sujet ici: social.msdn.microsoft.com/Forums/en-US/transactsql/thread/...
Vous devez vous connecter pour publier un commentaire.
Thilo cloué la différence justement...
COUNT( column_name )
peut retourner un nombre inférieurCOUNT( * )
sicolumn_name
peut êtreNULL
.Cependant, si je peux prendre un angle légèrement différent à répondre à votre question, puisque vous semblez être en se concentrant sur la performance.
Tout d'abord, notez que la délivrance de la
SELECT COUNT(*) FROM table;
sera potentiellement bloquer des écrivains, et il sera également bloqué par d'autres lecteurs/écrivains, sauf si vous avez modifié le niveau d'isolation (réflexe tend à êtreWITH (NOLOCK)
mais je vois une prometteuse nombre de personnes commence enfin à croire en RCSI). Ce qui signifie que pendant que vous êtes en train de lire les données pour obtenir votre "exactes" le comte, tous ces DML demandes s'accumulent, et lorsque vous avez enfin libéré de toutes vos serrures, les portes ouvertes, un tas de insert/update/delete activité qui se passe, et il y va de votre "précis" comte.Si vous avez besoin d'un absolument cohérentes et précises sur le nombre de lignes (même si c'est seulement valide pour le nombre de millisecondes qu'il faut pour renvoyer le nombre de vous), puis
SELECT COUNT( * )
est votre seul choix.D'autre part, si vous essayez d'obtenir un 99.9% des ballpark, vous êtes beaucoup mieux avec une requête comme ceci:
(Le
SUM
est là pour prendre en compte les tables partitionnées, - si vous n'utilisez pas la table de partitionnement, vous pouvez les laisser.)Ce DMV conservant la précision du nombre de lignes pour les tables à l'exception des lignes qui sont actuellement inscrits dans les transactions et ces transactions sont ceux qui vont faire de votre
SELECT COUNT
d'attente de requête (et, finalement, faire inexact avant d'avoir le temps de le lire). Mais sinon, cela conduira à une réponse plus rapide que la requête que vous proposez, et non moins précis queWITH (NOLOCK)
.count(id) doit null-cochez la colonne (ce qui peut être optimisé à l'écart pour une clé primaire ou autrement pas-colonne null), donc, count(*) ou count(1) doit être préférée (sauf si vous voulez vraiment savoir le nombre de lignes ayant une valeur non nulle pour l'id).