{"id":239,"date":"2011-04-25T00:00:35","date_gmt":"2011-04-25T00:00:35","guid":{"rendered":"http:\/\/www.sqlserver.fr\/blog\/?p=239"},"modified":"2026-05-02T14:31:21","modified_gmt":"2026-05-02T12:31:21","slug":"count","status":"publish","type":"post","link":"https:\/\/www.sqlserver.fr\/blog\/count\/","title":{"rendered":"COUNT(*)"},"content":{"rendered":"<p>Le mot cl\u00e9 COUNT correspondant \u00e0 une fonction d\u2019agr\u00e9gation permettant de comptabiliser le nombre d\u2019enregistrements d\u2019un jeu de r\u00e9sultats. Toutefois, lorsqu\u2019il s\u2019agit simplement de conna\u00eetre le nombre d\u2019enregistrements d\u2019une table, il y a bien plus rapide et plus efficace\u2026<!--more--><br \/>\nDans les exemples ci-apr\u00e8s, nous nous appuierons sur la base de donn\u00e9es AdventureWorks, disponible \u00e0 l\u2019adresse <a href=\"https:\/\/github.com\/Microsoft\/sql-server-samples\/releases\/tag\/adventureworks\">http:\/\/msftdbprodsamples.codeplex.com\/<\/a>.<br \/>\nLorsqu\u2019il s\u2019agit de compter le nombre d\u2019enregistrements de la table Sales.SalesOrderDetail, le premier r\u00e9flexe consiste \u00e0 utiliser la fonction COUNT.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">select COUNT(*) from Sales.SalesOrderDetail<\/pre>\n<p>Mais d\u00e8s lors que la table est un peu volumineuse, on s\u2019aper\u00e7oit que cette instruction prend pas mal de temps et de ressources.<br \/>\n<span style=\"font-size: x-small;\">Table &lsquo;SalesOrderDetail&rsquo;. Nombre d&rsquo;analyses 1, lectures logiques 229, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><\/p>\n<p>Pour plus d\u2019efficacit\u00e9, quelques tables syst\u00e8me pr\u00e9sentes depuis SQL Server 2005 permettent d\u2019obtenir de mani\u00e8re beaucoup plus rapide la r\u00e9ponse demand\u00e9e.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">select sum(rows)\nfrom sys.partitions p\n\tjoin sys.indexes i on i.object_id=p.object_id and p.index_id=i.index_id\n\tjoin sys.objects o on o.object_id=i.object_id\n\tjoin sys.schemas s on s.schema_id=o.schema_id\nwhere i.index_id in (0,1) --0 si la table n'a pas d'index clustered, 1 si elle en a un\n\tand o.name='SalesOrderDetail'\n\tand s.name='Sales'<\/pre>\n<p><span style=\"font-size: x-small;\">Table &lsquo;Worktable&rsquo;. Nombre d&rsquo;analyses 0, lectures logiques 0, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-size: x-small;\"> Table &lsquo;sysrowsets&rsquo;. Nombre d&rsquo;analyses 1, lectures logiques 5, lectures physiques 1, lectures anticip\u00e9es 15, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-size: x-small;\"> Table &lsquo;sysidxstats&rsquo;. Nombre d&rsquo;analyses 2, lectures logiques 4, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-size: x-small;\"> Table &lsquo;sysschobjs&rsquo;. Nombre d&rsquo;analyses 0, lectures logiques 4, lectures physiques 1, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-size: x-small;\"> Table &lsquo;sysclsobjs&rsquo;. Nombre d&rsquo;analyses 0, lectures logiques 2, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><\/p>\n<p>On voit que le nombre de lectures logiques est nettement plus r\u00e9duit, et surtout il serait inchang\u00e9 m\u00eame si la table contenait un nombre d\u2019enregistrements nettement plus important. Ainsi, chargeons une table de test avec 10 000 000 enregistrements assez volumineux.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">use tempdb\nset nocount on\ngo\ncreate table dbo.TestComptage (Id int identity primary key,\n\t\t\t\t\t\t\tDonnee nchar(1000) DEFAULT 'Valeur de test')\nGO\nINSERT INTO dbo.TestComptage (Donnee) VALUES (DEFAULT)\nGO 10000000<\/pre>\n<p>Pour cette table de tests, voici les diff\u00e9rents r\u00e9sultats de dur\u00e9e du comptage du nombre d\u2019enregistrements (le r\u00e9sultat est sans appel !) :<br \/>\n<span style=\"text-decoration: underline;\">Avec la m\u00e9thode COUNT(*) :<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> select COUNT(*) from dbo.TestComptage<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*\/<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> Temps d&rsquo;analyse et de compilation de SQL Server :<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> , Temps UC = 0 ms, temps \u00e9coul\u00e9 = 3 ms.<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 10000000<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">Table &lsquo;TestComptage&rsquo;. Nombre d&rsquo;analyses 4, lectures logiques 2510800, lectures physiques 8329, lectures anticip\u00e9es 1936602, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">SQL Server \\endash Temps d&rsquo;ex\u00e9cution :<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> , Temps UC = 16594 ms, temps \u00e9coul\u00e9 = 61123 ms.<\/span><br \/>\n<span style=\"text-decoration: underline;\">En passant par les tables syst\u00e8me :<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\">\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> select sum(rows)<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> from sys.partitions p<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> join sys.indexes i on i.object_id=p.object_id and p.index_id=i.index_id<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> join sys.objects o on o.object_id=i.object_id<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> join sys.schemas s on s.schema_id=o.schema_id<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> where i.index_id in (0,1) &#8211;0 si la table n&rsquo;a pas d&rsquo;index clustered, 1 si elle en a un<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> and o.name=&rsquo;TestComptage&rsquo;<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> and s.name=&rsquo;dbo&rsquo;<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;*\/<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> Temps d&rsquo;analyse et de compilation de SQL Server :<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> , Temps UC = 0 ms, temps \u00e9coul\u00e9 = 0 ms.<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> 10000000<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">Table &lsquo;sysclsobjs&rsquo;. Nombre d&rsquo;analyses 0, lectures logiques 2, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> Table &lsquo;sysidxstats&rsquo;. Nombre d&rsquo;analyses 0, lectures logiques 2, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> Table &lsquo;sysschobjs&rsquo;. Nombre d&rsquo;analyses 0, lectures logiques 110, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> Table &lsquo;sysrowsets&rsquo;. Nombre d&rsquo;analyses 1, lectures logiques 2, lectures physiques 0, lectures anticip\u00e9es 0, lectures logiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures physiques de donn\u00e9es d&rsquo;objets volumineux 0, lectures anticip\u00e9es de donn\u00e9es d&rsquo;objets volumineux 0.<\/span><\/p>\n<p><span style=\"font-family: 'courier new', courier;\">SQL Server \\endash Temps d&rsquo;ex\u00e9cution :<\/span><br \/>\n<span style=\"font-family: 'courier new', courier;\"> , Temps UC = 0 ms, temps \u00e9coul\u00e9 = 0 ms.<\/span><\/p>\n<p>A noter aussi que cette mani\u00e8re de compter le nombre de lignes peut aussi \u00eatre int\u00e9ressante pour les tables n\u2019ayant pas \u00e9norm\u00e9ment d\u2019enregistrements. En effet, m\u00eame si la dur\u00e9e et les I\/O gagn\u00e9s ne sont dans ce cas pas forc\u00e9ment \u00e9normes en temps normal, la m\u00e9thode consistant \u00e0 passer par les tables syst\u00e8me n\u2019est pas sensible aux verrous, et il est donc possible de compter les lignes m\u00eame si certains enregistrements sont verrouill\u00e9s par d\u2019autres processus\u2026<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le mot cl\u00e9 COUNT correspondant \u00e0 une fonction d\u2019agr\u00e9gation permettant de comptabiliser le nombre d\u2019enregistrements d\u2019un jeu de r\u00e9sultats. Toutefois, lorsqu\u2019il s\u2019agit simplement de conna\u00eetre le nombre d\u2019enregistrements d\u2019une table, il y a bien plus rapide et plus efficace\u2026<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-239","post","type-post","status-publish","format-standard","hentry","category-article_sql"],"_links":{"self":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/comments?post=239"}],"version-history":[{"count":6,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/239\/revisions"}],"predecessor-version":[{"id":1965,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/posts\/239\/revisions\/1965"}],"wp:attachment":[{"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/media?parent=239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/categories?post=239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlserver.fr\/blog\/wp-json\/wp\/v2\/tags?post=239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}