私がこのようなものを見つけることができるリンクを誰かが知っていますか?私はいくつかのテーブルから未使用の列全体を削除する提案に取り組んでいます。使用されているディスク容量を知ることができれば、それは本当に役に立ちます。
たとえば、550万行のテーブルがある場合、BIT / INT32 / DECIMAL(18,2)列を削除すると、どのくらいのスペースを節約できますか?
これはSQLServer2008です。
再度、感謝します!
私がこのようなものを見つけることができるリンクを誰かが知っていますか?私はいくつかのテーブルから未使用の列全体を削除する提案に取り組んでいます。使用されているディスク容量を知ることができれば、それは本当に役に立ちます。
たとえば、550万行のテーブルがある場合、BIT / INT32 / DECIMAL(18,2)列を削除すると、どのくらいのスペースを節約できますか?
これはSQLServer2008です。
再度、感謝します!
このSQLはすべての列を調べ、それらの集計を提供しますdatalength()
。
これはOPが求めていたものではないことを理解しています。これは、「SQLサーバーの列スペースが使用されました」をグーグルで検索してこの質問を見つけた貧しい人々の利益のためです。
ここにも私の要点があります。
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
列と実際のレコードの割り当てには大きな違いがあります。
タイプの場合:
しかし、現実の世界では、列はいくつかの配置規則で記録するためにグループ化されます。レコードは、数千のレコードを含むことができる大きなページによって割り当てられます。ディスク容量は、一部のレコードを部分的に保存するトランザクションジャーナルの影響も受けます。したがって、列サイズの線形依存性を推測することは困難です。
これは行ごとです
数値の場合:
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