5

共有ホスティング上にMSSQLServer 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によると、レコードあたりのバイト数は12ではなく15です。テーブルが占める合計ディスク容量を見て、それを除算すると、レコードあたりの15バイト数も正しいようです。行の数。

余分な3バイトを占めているのは何ですか?

4

2 に答える 2

6

これらの3つの追加は、NULLビットマップからのものです。Paulの投稿によると、列全体ですべてSPARSEであるものを除いて、すべての行にあります(SQL Server 2008以降)。

そして、このBOL投稿の行によると、NULLビットマップは= 2 +((number_columns_in_clustered_index + 7)/ 8)です。あなたの場合、3。

于 2013-02-06T00:32:29.817 に答える
1

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

ただし、最後のバイトはビットあたりの列数によって消費されます。つまり、テーブルに6列ある場合は、1バイト(6ビット)が必要です。12列がある場合は、2バイト(12ビット)が必要です。

あなたの場合、3つの列があるので、1バイトしかかかりません。

于 2016-08-18T13:42:44.833 に答える