有人知道我可以找到這些東西的鏈接嗎?我正在研究一個建議,從幾張表中刪除大量未使用的列,如果我能夠找出所使用的磁盤空間量,那確實會幫助我。SQL列使用多少磁盤空間
例如,如果我有一個550萬行的表,如果我放下BIT/INT32/DECIMAL(18,2)列,我將節省多少空間?
這是SQL Server 2008.
再次感謝!
有人知道我可以找到這些東西的鏈接嗎?我正在研究一個建議,從幾張表中刪除大量未使用的列,如果我能夠找出所使用的磁盤空間量,那確實會幫助我。SQL列使用多少磁盤空間
例如,如果我有一個550萬行的表,如果我放下BIT/INT32/DECIMAL(18,2)列,我將節省多少空間?
這是SQL Server 2008.
再次感謝!
列與實際記錄分配有很大差異。
對於類型:
但在現實世界中的列進行分組一些排列規則記錄。記錄由大頁面分配,可以包含一千個記錄。磁盤空間也受到事務日誌的影響 - 部分保存了一些記錄。所以很難推斷出列大小的線性相關性。
這是每行
對於數學運算:
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
這片SQL的越過你的所有列,併爲您的datalength()
的總和。
我意識到這不完全是OP所要求的 - 這是爲可憐的人誰的谷歌「SQL服務器列空間使用」的好處,並找到這個問題。
它也在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
我會說「創建數據庫的副本,從有問題的表中刪除列,然後取大小差異」,但如果數據庫很大,可能會有些不可行。 – JAB
是的,這是我的後備計劃。我遇到的問題是我們的「開發」數據庫是我們生產的數據庫的一個削減版本;發展的曲調是1 GB,而實際的產量接近5或6 GB –