残念ながら、テーブルがどのように作成され、データベースがどのように構成されているかについての十分な情報がないため、なぜあなたの計算が間違っているのかはわかりません。だから私は共通して答えようとします、そしてあなたはヒントを得るでしょう.
最初に知っておくべきことは、SQL Server データベースのサイズはmodel
データベースのサイズ以上であることです。これは、データベースが新しいデータベースのテンプレートであるため、ステートメントmodel
を実行するたびにコピーされるためです。CREATE DATABASE
データベース内のすべての情報は、ディスク上の 8 KB ページに格納されます。多くの種類のページがあります。それらの一部 (割り当てマップやメタデータなど) は内部目的で使用されますが、その他はデータの保存に使用されます。
テーブルのサイズは、ディスク上でデータがどのように構成されているか (クラスター化インデックスがあるかどうか)、列の種類、およびデータ圧縮によって異なります。インデックスのサイズは、インデックス付きテーブルの一意のインデックスの存在、インデックスのレベル数、フィル ファクターなどによって異なります。
前に言ったように、すべてはページとデータにも保存されます。SQL Server には、行内データ用のページ、行オーバーフロー データ用のページ、および LOB データ用のページがあります。データ ページは、ページ ヘッダー、データ行、およびデータ オフセット配列の 3 つの主要部分で構成されます。
ページ ヘッダーは各データ ページの最初の 96 バイトを占め、残りの 8,096 バイトは他のコンポーネントに使用されます。行オフセット配列は、ページの最後に格納される 2 バイト エントリのブロックです。エントリ カウントはヘッダーに格納され、スロット カウントと呼ばれます。
ヘッダーと行オフセット配列の間の領域は、データ行が格納される領域です。各行は、固定サイズ部分と可変長部分の 2 つのコンポーネントで構成されます。
データ行の構造は次のとおりです。
- ステータスビット A、1 バイト
- ステータスビット B、1 バイト
- 固定長サイズ (FSize)、2 バイト
- 固定長データ (FData)、FSize – 4
- 列数 (NCol)、2 バイト
- NULL ビットマップ、天井 (NCol / 8)
- 行に格納される可変長列の数 (VarCount)、2 バイト
- 可変列オフセット配列 (VarOffset)、2 * VarCount
- 可変長データ (VarData)、VarOff[VarCount] - (Fsize + 4 + Ceiling (NCol / 8) + 2 * VarCount)
注インデックス行は、データ行と同じ方法で格納されます。
ここですべてを説明したわけではありませんが、SQL Server が割り当てられた領域をどのような目的で使用するかを理解するのに役立つことを願っています。FILEGROWTH
また、データベース ファイルはオプションで指定されたサイズだけ大きくなるため、実際のサイズが見積もりよりも大きくなる可能性があることに注意してください。
また、Microsoft SQL Server 2012 Internals book を見て、 how to Estimate the Size of a Databaseを読んでください。それはおそらくあなたにとって興味深いでしょう。