如何检查哪些表和字段占用更多空间?

时间:2010-09-23 08:43:51

标签: sql-server tsql sql-server-2000

我有一个比预期更大的数据库,如何查询它以检索占用更多空间的字段。

假设我只有2张桌子

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

假设99.9%的数据库数据在Table2.FieldTwo中,我如何查询数据库?

当然我有很多桌子。

db在sqlserver 2000上

1 个答案:

答案 0 :(得分:1)

我想不出一个简单方式来做到这一点。

一种方法是动态生成TSQL以列出每个表中每列的总大小,这可以通过以下方式完成:

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

将返回例如

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

然而,我担心这可能是一个非常重要的查询,所以我会首先仔细考虑它。如果没有更好的建议并且你尝试这个,那么可能值得限制它只查看列的子集 - 即忽略你从一开始就知道的任何列都很小,专注于你知道可能的列是更大的。

理想的解决方案是,如果这些信息已经存储在系统表中/可以通过DMV以某种方式访问​​ - 不幸的是我不知道是否存在,如果可用,我从未遇到过它。