2010-09-23 7 views
0

J'ai une base de données qui a une taille plus grande que prévu, comment puis-je l'interroger pour récupérer les champs qui prennent plus d'espace.comment vérifier quelles tables et champs prennent plus d'espace?

Disons que j'ai 2 seulement des tables

Table1.FieldOne 
Table1.FieldTwo 
Table2.FieldOne 
Table2.FieldTwo 

Disons que 99,9% des données DB est Table2.FieldTwo, comment puis-je interroger les db?

Bien sûr, j'ai beaucoup de nombreuses tables.

Le db est sur SQL Server 2000

Répondre

1

Je ne peux pas penser à un facile façon de le faire du haut de ma tête.

Une façon serait faire générer dynamiquement la TSQL à la liste la taille totale de chaque colonne de chaque table qui pourrait être fait en utilisant quelque chose comme ceci:

DECLARE @SQL VARCHAR(MAX) 

SELECT @SQL = COALESCE(@SQL + CHAR(10) + 'UNION ALL' + CHAR(10), '') + 
    'SELECT ''' + QUOTENAME(t.name) + ''' AS TableName, ''' + QUOTENAME(c.name) + ''' AS ColumnName, SUM(DATALENGTH(' + QUOTENAME(c.name) + ')) AS TotalSizeBytes 
    FROM ' + QUOTENAME(t.name) 
FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id 
WHERE t.name = 'VoterAccount' 

SET @SQL = 'SELECT TableName, ColumnName, TotalSizeBytes FROM (' + @SQL + ') x ORDER BY TotalSizeBytes DESC' 
PRINT @SQL -- Just PRINT the SQL out. You can then copy it, and execute manually 

qui renverrait par exemple

TableName ColumnName TotalSizeBytes 
Table1  Column1  123456789 
Table1  Column3  34356464 
Table2  ColumnA  33987987 

Cependant, je crains que c'est susceptible d'être une requête assez lourde pour fonctionner donc je pense bien à son sujet d'abord. S'il n'y a pas de meilleures suggestions et que vous essayez ceci, il pourrait être utile de le restreindre uniquement à un sous-ensemble de colonnes - c'est-à-dire ignorer les colonnes que vous connaissez depuis le début sont de petite taille être les plus grands.

La solution idéale serait que cette information soit déjà contenue dans les tables système/accessible via DMV d'une manière ou d'une autre - malheureusement je ne sais pas si c'est le cas, je ne l'ai jamais rencontré.

+0

cela combiné avec une instruction exec (@SQL) fait exactement ce dont j'ai besoin, merci. Donc votre solution remplaçant PRINT @SQL par EXEC (@SQL) est parfaite. – LaBracca