Il est intéressant, pour suivre l’évolution d’une base de données, et pour prévoir l’espace disque nécessaire, de connaître le nombre de lignes que contient chaque table.
Ce qui vient en premier à l’esprit lorsqu’on souhaite quantifier les lignes, c’est d’exécuter un SELECT COUNT(*) sur chacune des tables à travers un curseur sur chacune des tables de la base de données, ou encore d’user de la procédure stockée système sp_spaceused sur le même modèle.
Mais il est évident que ce n’est pas performant et le résultat est long à obtenir.
Voyons comment obtenir cela sans effort, ni pour nous, ni pour le moteur de base de données …
Les tables et vues système exposent ces informations, mais de manière différente entre SQL Server 2000 et ses successeurs.
Regardons tout d’abord comment on peut obtenir le nombre de lignes de toutes les tables de la base de données en cours sous SQL Server 2000 :
1 2 3 4 5 6 7 8 9 10 | --------------------------------- -- 27/09/2009 - Nicolas SOUQUET - --------------------------------- SELECT O.name AS nomTable, I.rowcnt AS nbLignes FROM sysindexes AS I JOIN sysobjects AS O ON I.id = O.id AND O.xtype = 'U' AND I.indid < 2 |
La colonne indid de la table sysindexes peut prendre les valeurs suivantes :
– 0 si la table n’est pas ordonnée en cluster (c’est donc un segment mémoire, ou heap)
– 1 si la table est ordonnée en cluster
– 2 pour tous les indexes non-cluster posés sur la table.
Voyons maintenant comment faire sous SQL Server 2005 et 2008 :
1 2 3 4 5 6 7 8 9 | --------------------------------- -- 27/09/2009 - Nicolas SOUQUET - --------------------------------- SELECT T.name AS table_name, PS.row_count FROM sys.dm_db_partition_stats AS PS JOIN sys.tables AS T ON PS.object_id = T.object_id WHERE PS.index_id BETWEEN 0 AND 1 ORDER BY T.name |
Comme on peut le voir, les deux requêtes sont très simples et permettent de ne pas bloquer l’accès aux tables, ce qui s’avèrera forcément appréciable sur des tables dont on sait que le nombre de lignes est important.
ElSuket