6

私がこのようなものを見つけることができるリンクを誰かが知っていますか?私はいくつかのテーブルから未使用の列全体を削除する提案に取り組んでいます。使用されているディスク容量を知ることができれば、それは本当に役に立ちます。

たとえば、550万行のテーブルがある場合、BIT / INT32 / DECIMAL(18,2)列を削除すると、どのくらいのスペースを節約できますか?

これはSQLServer2008です。

再度、感謝します!

4

3 に答える 3

6

この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
于 2016-07-13T08:57:53.803 に答える
4

列と実際のレコードの割り当てには大きな違いがあります。

タイプの場合:

  • ビット-レコードに複数のビット列がある場合に単一の物理列(たとえば4バイト整数)にグループ化される整数です
  • int32-4バイトかかります
  • DECIMALは、 http://msdn.microsoft.com/en-us/library/ms221061 (v = VS.85).aspx(12バイト)で説明されている構造と非常によく似ています。

しかし、現実の世界では、列はいくつかの配置規則で記録するためにグループ化されます。レコードは、数千のレコードを含むことができる大きなページによって割り当てられます。ディスク容量は、一部のレコードを部分的に保存するトランザクションジャーナルの影響も受けます。したがって、列サイズの線形依存性を推測することは困難です。

于 2011-07-22T13:49:27.940 に答える
2

これは行ごとです

数値の場合:

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
于 2011-07-22T13:52:39.437 に答える