242 votes

Requête pour lister le nombre d'enregistrements dans chaque table d'une base de données

Comment lister le nombre de lignes de chaque table dans la base de données. Un équivalent de

select count(*) from table1
select count(*) from table2
...
select count(*) from tableN

Je vais publier une solution mais d'autres approches sont les bienvenues.

365voto

marc_s Points 321990

Si vous utilisez SQL Server 2005 et plus, vous pouvez également utiliser ceci :

SELECT 
    t.NAME AS TableName,
    i.name as indexName,
    p.[Rows],
    sum(a.total_pages) as TotalPages, 
    sum(a.used_pages) as UsedPages, 
    sum(a.data_pages) as DataPages,
    (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, 
    (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, 
    (sum(a.data_pages) * 8) / 1024 as DataSpaceMB
FROM 
    sys.tables t
INNER JOIN      
    sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
    sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    t.NAME NOT LIKE 'dt%' AND
    i.OBJECT_ID > 255 AND   
    i.index_id <= 1
GROUP BY 
    t.NAME, i.object_id, i.index_id, i.name, p.[Rows]
ORDER BY 
    object_name(i.object_id) 

A mon avis, il est plus facile à manipuler que le sp_msforeachtable sortie.

1 votes

Une idée de la raison pour laquelle il filtre les tables dont le nom commence par "dt" ? J'ai vu ce script partout sur le net, mais aucune explication sur ce critère. Sommes-nous tous victimes d'un troll ?

7 votes

@Skaue : si vous installez la fonctionnalité "Diagramme de base de données" dans une de vos bases de données, vous aurez alors des tables telles que dtProperties et ainsi de suite ; étant donné qu'il s'agit de tables "système", je ne veux pas faire de rapport sur celles-ci.

1 votes

Possibilité de préfixer le nom du tablename avec le nom du schéma dans ce script ?

136voto

Erik Anderson Points 119

Un extrait que j'ai trouvé à http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=21021 qui m'ont aidé :

select t.name TableName, i.rows Records
from sysobjects t, sysindexes i
where t.xtype = 'U' and i.id = t.id and i.indid in (0,1)
order by TableName;

5 votes

J'aime bien cette solution, même si j'utiliserais la fonction JOIN syntaxe from sysobjects t inner join sysindexes i on i.id = t.id and i.indid in (0,1) where t.xtype = 'U'

0 votes

Je préfère aussi utiliser les instructions JOIN, mais j'ai posté le code tel que je l'ai trouvé :)

46voto

petra Points 161

Pour obtenir cette information dans SQL Management Studio, faites un clic droit sur la base de données, puis sélectionnez Reports --> Standard Reports --> Disk Usage by Table.

10 votes

Approche sous-estimée, elle permet de générer rapidement un rapport triable indiquant le nombre de lignes et la taille des données.

6voto

KM. Points 51800

Comme vu ici, cela retournera des comptages corrects, alors que les méthodes utilisant les tableaux de métadonnées ne retourneront que des estimations.

    CREATE PROCEDURE ListTableRowCounts 
    AS 
    BEGIN 
        SET NOCOUNT ON 

        CREATE TABLE #TableCounts
        ( 
            TableName VARCHAR(500), 
            CountOf INT 
        ) 

        INSERT #TableCounts
            EXEC sp_msForEachTable 
                'SELECT PARSENAME(''?'', 1), 
                COUNT(*) FROM ? WITH (NOLOCK)' 

        SELECT TableName , CountOf 
            FROM #TableCounts
            ORDER BY TableName 

        DROP TABLE #TableCounts
    END
    GO

0 votes

Il s'agit donc d'un compromis entre l'utilisation de la procédure non documentée sp_msForEachTable et l'utilisation des tables du système dont les informations ne sont pas toujours à jour. +1 et merci pour le lien

1voto

Si vous utilisez MySQL >4.x, vous pouvez l'utiliser :

select TABLE_NAME, TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA="test";

N'oubliez pas que pour certains moteurs de stockage, TABLE_ROWS est une approximation.

7 votes

Il a mentionné "sql-server" dans son message (en tant que balise), ce qui correspond à Microsoft SQL Server.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X