SQL Server确定表列的物理大小

时间:2010-03-11 08:51:36

标签: sql-server

是否可以找出表中各列的数据大小(KB或MB)?我有一个脚本告诉我每个表的物理大小,但我想知道数据库中的某些列占用了多少,特别是当我将XML存储在列中时。

任何帮助非常感谢

干杯

4 个答案:

答案 0 :(得分:22)

你应该可以使用datalength函数,比如

select sum(datalength(yourfield))
from yourtable

这将汇总表中该字段的所有条目的数据长度 - 它不会考虑诸如可变长度字段指针,可空性位图中的空间等开销。

答案 1 :(得分:2)

对于“表的所有列” 的视图大小,您可以首先使用以下命令生成表的字段:

SELECT 'SUM(DATALENGTH('+Column_name+')) / (1024*1024) as '+Column_name+'_MB,'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '--TABLE_NAME--'

然后运行以下查询:

SELECT
    /*result previous query (with remove last comma)*/
FROM --TABLE_NAME--

答案 2 :(得分:1)

选择SUM(DATALENGTH(columnsA))/ 1024.0 AS KB

答案 3 :(得分:0)

这将返回特定数据库中的所有列及其数据大小,并且可以轻松地更新为仅返回特定表或列的数字。

USE [YourDatabase]
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
CREATE TABLE #temp (tablename varchar(max), columnname varchar(max), sizeinkb float)

DECLARE MY_CURSOR Cursor LOCAL FAST_FORWARD 
FOR SELECT table_name, column_name FROM INFORMATION_SCHEMA.COLUMNS

Open My_Cursor 
DECLARE @table varchar(max), @column varchar(max)
Fetch NEXT FROM MY_Cursor INTO @table, @column
While (@@FETCH_STATUS <> -1)
BEGIN
    DECLARE @sql varchar(1000) = 'INSERT #temp SELECT ''' + @table + ''', ''' + @column + ''', sum(datalength(' + @column + ')) / 1024.0 FROM ' + @table
    EXEC (@sql)

    FETCH NEXT FROM MY_CURSOR INTO @table, @column
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO

SELECT * FROM #temp ORDER BY 3 DESC