2013-02-06 10 views
5

私は共有ホスティングにMS SQL Server 2008データベースを持っており、使用するストレージスペースをできるだけ減らす必要があります。私の最大の表の定義は、次のとおりです行サイズのオーバーヘッド

CREATE TABLE [stage](
    [station_id] [smallint] NOT NULL, 
    [time_utc] [smalldatetime] NOT NULL, 
    [stage_mm] [smallint] NOT NULL, 
CONSTRAINT [PK_stage] PRIMARY KEY CLUSTERED ([station_id] ASC,[time_utc] ASC) 

私は私のテーブルにレコードごとの平均バイト数を見つけることを試みました。 理論によると、サイズは4B(行ヘッダー)+ 2B(smallint)+ 4B(smalldatetime)+ 2B(smallint)(12バイト)です。私は、コマンド実行時

しかし、:

dbcc showcontig ('stage') with tableresults 

をこれは示していますMinimumRecordSize = 15、MaximumRecordSize = 15 だから、SQL Serverによると、レコードごとにバイトが15ではなく12 数15バイトでありますテーブルごとの合計ディスク容量を調べ、それを行数で割ると、レコードごとに正しいと思われます。

3つの余分なバイトを占めていますか?

答えて

5

これらの余分なものは、NULLビットマップからのものです。 According to Paul's postでは、SQL Server 2008以降のすべての列でSPARSEである行をすべての行に保存します。

そして、this BOL postの行によれば、NULLビットマップは、2 +((number_columns_in_clustered_index + 7)/ 8)である。あなたの場合、3

+0

ありがとうございます。したがって、私の場合、SQL Server 2008の行オーバーヘッドを7バイト未満に減らすことは不可能です。 – jirikadlec2

1

私は部分的に@Mattに同意しますが、2バイトは正しいNULLビットマップに必要です。

ただし、最後のバイトは1ビットあたりのカラム数で消費されます。意味、テーブルに6つの列がある場合は1バイト(6ビット)が必要です。または、12の列がある場合は2バイト(12ビット)が必要になります。あなたのケースでは3列がある

ので、それだけで1バイトをとっています。

関連する問題