Récemment, je travaillais sur un projet d'amélioration des performances d'une base de données. Une procédure stockée causait des problèmes. Dans son code, une requête a rempli le nombre de lignes et stocké la valeur dans une variable locale. Cette requête balayait une grande table. De ce fait, l'utilisation des ressources est devenue considérablement plus élevée. Pour résoudre le problème, nous avons supprimé le code défectueux et utilisé les vues du catalogue SQL Server pour générer le nombre de lignes de la table.
Il existe différentes façons de compter le nombre de lignes dans une table de SQL Server. Cet article les décrira pour que vous choisissiez toujours la bonne façon de le faire.
Nous pouvons obtenir le nombre de lignes de la table avec l'une des méthodes suivantes :
- Utilisez la fonction COUNT().
- Combiner des vues de catalogue SQL Server
- Utiliser sp_spaceused procédure stockée.
- Utilisation de SQL Server Management Studio.
Creusons plus profondément.
Obtenir le nombre de lignes à l'aide de COUNT(*) ou Count(1)
Nous pouvons utiliser la fonction COUNT(*) ou COUNT(1) - les résultats générés par ces deux fonctions sont identiques.
Pour obtenir le nombre de lignes, exécutons d'abord la requête en utilisant COUNT(*). À des fins de démonstration, j'ai défini la valeur de STATISTICS IO sur ON.
USE wideworldimporters
go
SELECT Count(*)
FROM tblcustomer
go
Sortie :
Statistiques IO :
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 315, page server reads 0, read-ahead reads 276, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Comme vous pouvez le voir, SQL Server doit effectuer 691 lectures logiques pour satisfaire le résultat.
Maintenant, exécutons la requête en utilisant COUNT(1):
USE wideworldimporters
go
SELECT Count(1)
FROM tblcustomer
go
Sortie :
Statistiques IO :
Table 'tblCustomer'. Scan count 1, logical reads 691, physical reads 687, page server reads 0, read-ahead reads 687, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Encore une fois, SQL Server doit effectuer 691 lectures logiques pour satisfaire le résultat.
Il convient de mentionner qu'il existe une opinion selon laquelle la fonction Count (1) est plus rapide que la fonction Count (*). Cependant, comme vous pouvez le voir dans les exemples ci-dessus, les ensembles de résultats et les statistiques d'E/S sont les mêmes. Par conséquent, vous pouvez utiliser n'importe quelle méthode pour générer le nombre de lignes des tables.
Avantages :
La fonction COUNT remplit un nombre précis de lignes de la table.
Inconvénients :
Lorsque vous exécutez la fonction COUNT, elle place un verrou sur la table. Les autres requêtes accédant à la table doivent attendre que le résultat soit généré. Si vous travaillez sur un système occupé avec une table contenant des millions de lignes, vous feriez mieux d'éviter d'exécuter la fonction COUNT pendant les heures ouvrables, à moins que vous ne deviez remplir le nombre exact de lignes de la table.
Combiner des vues de catalogue SQL Server
Nous pouvons utiliser les vues de catalogue SQL Server avec les vues de gestion dynamique suivantes :
- sys.tables – remplit la liste des tables.
- sys.indexes – renseigne la liste des index de la table.
- sys.partitions – remplit les lignes de chaque partition.
Pour obtenir le nombre de lignes, exécutez le script suivant :
SELECT a.NAME,
c.NAME,
Sum(b.rows)
FROM sys.tables a
INNER JOIN sys.partitions b
ON a.object_id = b.object_id
INNER JOIN sys.indexes c
ON b.index_id = c.index_id
AND b.object_id = c.object_id
WHERE a.object_id = Object_id('tblCustomer')
AND c.index_id < 2
Sortie :
La requête renseigne le nom de la table , nom de l'index, et le nombre total de lignes dans toutes les partitions.
Passons maintenant en revue les statistiques d'E/S :
Table 'syssingleobjrefs'. Scan count 3, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysidxstats'. Scan count 1, logical reads 6, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysschobjs'. Scan count 0, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Table 'sysrowsets'. Scan count 2, logical reads 14, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Comme vous pouvez le voir, la requête n'effectue que 30 lectures logiques.
Avantages :
Cette approche est plus rapide que la fonction COUNT. Il n'acquiert pas de verrou sur la table utilisateur, vous pouvez donc l'utiliser dans un système occupé.
Inconvénients :
La méthode remplit un nombre approximatif de lignes. Dans la documentation Microsoft de sys.partitions, vous pouvez voir que les lignes colonne apporte le nombre approximatif de lignes pour les partitions.
Ainsi, si vous recherchez une requête qui apporte le résultat plus rapidement que la fonction COUNT, vous pouvez utiliser celle-ci. Cependant, le résultat peut être inexact.
Utilisez sp_spaceused
Le sp_spaceutilisé procédure avec le nombre de lignes fournit les détails suivants :
- Nom – le nom de la table
- Lignes – le nombre de lignes dans une table.
- Réservé – l'espace total réservé pour une table.
- Données – l'espace total utilisé par la table.
- Index_size – l'espace total utilisé par l'index.
- Inutilisé – l'espace total réservé pour une table qui n'est pas utilisée.
La syntaxe est :
EXEC Sp_spaceused 'database_name.schema_name.table_name'
La requête :
EXEC Sp_spaceused 'WideWorldImportors.dbo.tblCustomer'
Sortie :
Utiliser SQL Server Management Studio
Pour obtenir le nombre de lignes de la table, nous pouvons utiliser SQL Server Management Studio.
Ouvrez SQL Server Management studio> Connectez-vous à l'instance de base de données> Développez les tables> Cliquez avec le bouton droit sur tblCustomer> Propriétés
Dans le tableau Propriétés fenêtre, cliquez sur Stockage . Vous verrez le nombre de lignes valeur à droite :
Une autre option pour obtenir le nombre de lignes dans une table est fournie avec le complément SQL Complete SSMS. Grâce à cette amélioration, vous pouvez voir le nombre estimé de lignes dans un indice lorsque vous passez la souris sur un nom de table dans la fenêtre de l'Explorateur d'objets. De cette façon, vous pouvez obtenir les données nécessaires en mode visuel sans aucun effort supplémentaire.
Conclusion
Cet article a expliqué différentes approches pour calculer le nombre total de lignes du tableau, en particulier :
- Utilisation de la fonction COUNT.
- Combiner différentes vues de catalogue.
- Utiliser sp_spaceused procédure stockée.
- Utilisation de SQL Server Management Studio.
Il n'est pas nécessaire de s'en tenir à une seule méthode. Chaque variante a ses spécificités, et vous pouvez appliquer celle qui convient le mieux à votre situation.