SQL 列使用多少磁盘空间

Jim*_*m B 9 diskspace sql-server-2008

有人知道我可以找到这些东西的链接吗?我正在制定一项提案,从几个表中删除一大堆未使用的列,如果我能找出使用的磁盘空间量,那将真正帮助我。

例如,如果我有一个包含 550 万行的表,如果删除 BIT/INT32/DECIMAL (18,2) 列,我会节省多少空间?

这是 SQL Server 2008。

再次感谢!

Joh*_*ohn 7

这段 sql 会遍历您的所有列,并为您提供它们的聚合datalength()

我意识到这并不完全是OP所要求的——这是为了那些在谷歌上搜索“sql server列空间使用”并找到这个问题的可怜人的利益。

这也是我的要点

create table #space ([table] nvarchar(255), [column] nvarchar(255) not null, [bytes] bigint null);

declare @sql varchar(max) = ''
declare @tablepattern as varchar(255) = '%'
declare @exclusionpattern as varchar(255) = ''

select @sql = @sql + 'insert into #space select ''' + t.name + ''', ''' + c.name + ''', sum(datalength([' + c.name + '])) as bytes from [' + t.name + '];' 
from sys.columns c
inner join sys.tables t on c.object_id = t.object_id
where t.name like @tablepattern and t.name not like @exclusionpattern;

exec (@sql)

select [table], format(sum([bytes]), '#,#') as [size]
from #space
group by [table]
order by sum(bytes) desc;

select [table], [column], format([bytes], '#,#') as [size]
from [#space]
order by [bytes] desc;

drop table #space
Run Code Online (Sandbox Code Playgroud)


Dew*_*wfy 4

列和实际记录分配之间存在很大差异。

对于类型:

但在现实世界中,列被分组以按照一些对齐规则进行记录。记录按大页分配,可以包含数千条记录。磁盘空间还受到事务日志的影响 - 事务日志会部分保存一些记录。因此很难推断出列大小的线性相关性。