Liste des tailles de table pour toutes les tables de toutes les bases de données

8

Existe-t-il un moyen simple de répertorier la taille de chaque table dans chaque base de données sur un serveur MSSQL?

J'ai utilisé une requête sur sys.tables pour obtenir des résultats pour une seule base de données, mais nous avons> 100 bases de données par serveur, donc un moyen d'obtenir les mêmes résultats mais pour toutes les bases de données serait génial.

Actuellement, je dois créer une liste temporaire de bases de données à partir de master.sys.databases, puis itérer dessus avec un curseur, créer une requête et insérer les résultats dans une table temporaire avec EXEC sp_executeSQL @SQLString.

Cylindrique
la source
Les informations sur l'espace objet sont stockées dans la base de données où réside l'objet. Il n'y a donc pas d'autre moyen que d'itérer en utilisant une liste de bases de données. Quelle version de SQL Server utilisez-vous?
Edward Dortland
@cylindric, un lien utile ici
Biju jose

Réponses:

6

Si vous vouliez obtenir cela dans tout votre environnement, pour toutes vos bases de données ... et cela ne vous dérange pas d'utiliser PowerShell ... Vous devrez l'exécuter à partir d'une machine sur laquelle SQL Server 2008 Management Studio est au moins installé.


# Load SMO
[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | Out-Null

function Get-TableSize ([string[]]$server) {
    foreach ($srv in $server) {
        $s = New-Object 'Microsoft.SqlServer.Management.Smo.Server' $srv

        $s.Databases.Tables | 
            ? {-Not $_.IsSystemObject} | 
                Select @{Label="Server";Expression={$srv}},
                    @{Label="DatabaseName";Expression={$_.Parent}}, 
                    @{Label="TableName";Expression={$_.Name}}, 
                    @{Label="SizeKB";Expression={$_.DataSpaceUsed}}
    }
}

Comme étiqueté les DataSpaceUsedsorties d'objet SMO dans "KB", vous pouvez le modifier pour être la mesure de votre choix en y mettant simplement la référence abrégée. Donc , si je voulais « MB »: $_.DataSpaceUsed/1MB.

Dans la fonction ([string[]]$server), les crochets "[]" signifient que le paramètre accepte un tableau d'objets. Donc, si vos serveurs sont répertoriés dans un fichier, vous pouvez appeler la fonction comme suit:


$list = get-content .\ServerList.txt
Get-TableSize -server $list | Out-GridView

Je préfère utiliser Out-GridViewinitialement pour revoir la sortie, et elle se copie facilement directement dans Excel pour moi. Vous pouvez également les exporter vers les autres formats pris en charge de PowerShell si vous le souhaitez.

Exemple avec capture d'écran, vous pouvez également lister les serveurs: entrez la description de l'image ici


la source
Cela pourrait être assez parfait. Je vais le tester!
Cylindrique
Parfait merci. Je n'ai eu qu'à ajouter une authentification et j'ai obtenu les champs supplémentaires dont j'avais besoin à partir de l'objet Table technet.microsoft.com/en-us/library/…
Cylindrique le
5

Extrait de Stack-Overflow: obtenir la taille de toutes les tables de la base de données

SELECT 
    t.NAME AS TableName,
    s.Name AS SchemaName,
    p.rows AS RowCounts,
    SUM(a.total_pages) * 8 AS TotalSpaceKB, 
    SUM(a.used_pages) * 8 AS UsedSpaceKB, 
    (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
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
LEFT OUTER JOIN 
    sys.schemas s ON t.schema_id = s.schema_id
WHERE 
    t.NAME NOT LIKE 'dt%' 
    AND t.is_ms_shipped = 0
    AND i.OBJECT_ID > 255 
GROUP BY 
    t.Name, s.Name, p.Rows
ORDER BY 
    t.Name
rolfl
la source
1
C'est exactement ce que j'ai déjà qui ne fait pas ce dont j'ai besoin - cela ne montre qu'une seule base de données.
Cylindrique
2

J'ai utilisé une fusion des réponses précédentes:

USE [master];
GO

sp_msforeachdb 'USE [?]; 
SELECT  
''?'' as db,    
t.NAME AS TableName,    
s.Name AS SchemaName,    
p.rows AS RowCounts,    
SUM(a.total_pages) * 8 AS TotalSpaceKB,     
SUM(a.used_pages) * 8 AS UsedSpaceKB, 
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB 
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
LEFT OUTER JOIN     sys.schemas s ON t.schema_id = s.schema_id 
WHERE    p.rows > 0 AND t.is_ms_shipped = 0    AND i.OBJECT_ID > 255 
GROUP BY     t.Name, s.Name, p.Rows 
ORDER BY p.rows DESC' ;
Fer R
la source
1

Vous pouvez essayer d'utiliser sp_msforeachdbcependant quelques avertissements avec cela.

Cela étant dit, je l'utilise avec succès depuis plusieurs années maintenant.

sp_msforeachdb 'USE [?]; SELECT * FROM sys.tables'

Fondamentalement, il fait un curseur et un remplacement sur le? avec le nom de la base de données.

Vous pouvez également essayer la version de remplacement d'Aaron Bertrand. Je ne l'ai pas essayé moi-même mais c'est censé être mieux.

Kenneth Fisher
la source
0

Ce qui suit résoudra votre question:

use master
DECLARE @xQry NVARCHAR(MAX)=''
SELECT @xQry+= ' UNION ALL SELECT '''+name+''' COLLATE Modern_Spanish_CI_AS AS [Database], 
    schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS AS [table], 
        cast(sum(spc.used_pages * 8)/1024.00 as numeric(36, 2)) as used_mb,
        cast(sum(spc.total_pages * 8)/1024.00 as numeric(36, 2)) as allocated_mb
    from '+name+'.sys.tables tab
    join '+name+'.sys.indexes ind 
         on tab.object_id = ind.object_id
    join '+name+'.sys.partitions part 
         on ind.object_id = part.object_id and ind.index_id = part.index_id
    join '+name+'.sys.allocation_units spc
         on part.partition_id = spc.container_id
    group by schema_name(tab.schema_id) + ''.'' + tab.name COLLATE Modern_Spanish_CI_AS'
FROM sys.databases 

SET @xQry= RIGHT(@xQry,LEN(@xQry)-11) + ' order by 3 desc'
EXEC (@xQry)
FMA
la source