SQL列使用多少磁盘空间

时间:2011-07-22 13:36:12

标签: sql-server-2008 diskspace

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

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

这是SQL Server 2008。

再次感谢!

3 个答案:

答案 0 :(得分:2)

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

对于类型:

但在现实世界中,列被分组以记录一些对齐规则。记录由大页面分配,可包含数千条记录。磁盘空间也受事务日志的影响 - 部分保存了一些记录。因此很难推断出列大小的线性依赖性。

答案 1 :(得分:2)

这段sql覆盖了所有列,并为您提供了datalength()的汇总。

我意识到这并不是OP所要求的 - 这是为了谷歌“sql server列空间使用”的穷人的利益,并找到了这个问题。

它也在my gist here

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

答案 2 :(得分:1)

这是Per ROW

对于数字:

tinyint  1 byte
smallint 2 bytes
int      4 bytes
bigint   8 bytes

Bit会在整个记录中汇总,因此在不了解您的结构的情况下很难说。它不太可能节省太多。

DECIMAL取决于精度:

1 - 9   5 bytes
10 - 19 9 bytes
20 - 28 13 bytes
29 - 38 17 bytes