2010-09-23 22 views
0

我有一個比預期更大的數據庫,我如何查詢它來檢索需要更多空間的字段。如何檢查哪些表和字段佔用更多空間?

比方說,我有2個表

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

假設DB數據的99.9%,是Table2.FieldTwo,我該如何查詢數據庫?

當然,我有很多很多表。

的數據庫是SQLSERVER 2000

回答

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訪問 - 不幸的是,我不知道它是否是,如果可用,我從來沒有遇到過。

+0

這與exec(@SQL)語句的組合完全符合我的需要,謝謝。因此,您用EXEC(@SQL)取代PRINT @SQL的解決方案非常完美。 – LaBracca 2010-09-23 11:33:16

相關問題