Mikael Eriksson a une bonne explication ci-dessous pourquoi la première requête est rapide :
Le serveur SQL l'optimise en :if exists(select * from BookChapters)
. Il va donc chercher la présence d'une ligne au lieu de compter toutes les lignes du tableau.
Pour les deux autres requêtes, SQL Server utiliserait la règle suivante. Pour effectuer une requête comme SELECT COUNT(*)
, SQL Server utilisera le plus étroitsans cluster index pour compter les lignes. Si la table n'a pas d'index non clusterisé, il devra parcourir la table.
Aussi, si votre table a un cluster index, vous pouvez obtenir votre compte encore plus rapidement en utilisant la requête suivante (empruntée à ce site Get Row Counts Fast !)
--SQL Server 2005/2008
SELECT OBJECT_NAME(i.id) [Table_Name], i.rowcnt [Row_Count]
FROM sys.sysindexes i WITH (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rowcnt desc
--SQL Server 2000
SELECT OBJECT_NAME(i.id) [Table_Name], i.rows [Row_Count]
FROM sysindexes i (NOLOCK)
WHERE i.indid in (0,1)
ORDER BY i.rows desc
Il utilise la table système sysindexes. Vous trouverez plus d'informations ici SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL Server 2012
Voici un autre lien Pourquoi mon SELECT COUNT (*) est-il si lent ? avec une autre solution. Il montre la technique que Microsoft utilise pour afficher rapidement le nombre de lignes lorsque vous faites un clic droit sur le tableau et sélectionnez les propriétés.
select sum (spart.rows)
from sys.partitions spart
where spart.object_id = object_id(’YourTable’)
and spart.index_id < 2
Vous devriez constater que cela revient très rapidement, quel que soit le nombre de tables que vous avez.
Si vous utilisez toujours SQL 2000, vous pouvez utiliser la table sysindexes pour obtenir le numéro.
select max(ROWS)
from sysindexes
where id = object_id(’YourTable’)
Ce nombre peut être légèrement décalé en fonction de la fréquence à laquelle SQL met à jour la table sysindexes, mais il est généralement correct (ou du moins suffisamment proche).