4

前提条件としてデータベースのサイズを見積もる必要があるため、以下の例で SQL Server がデータを格納する方法を理解しようとしています。

私の SQL Server データベースには、次の 4 つの行を含む InfoComp という名前のテーブルがあります。

IdInfoComp : Integer Not Null (PK)  
IdDefinition : Integer Not Null (FK)  
IdObject : Integer Not Null (FK)  
Value : NVarChar(Max) Not Null 

テーブルのサイズを見積もりたい。Value実際の使用では、次のSQL クエリで格納されている平均の長さを取得できます。

SELECT AVG(Value) FROM InfoComp  
Result : 8

したがって、私の計算は次のようです(バイト単位):

(Size(IdInfoComp) + Size(IdDefinition) + Size(IdObject) + AVG Size(Value)) * Rows count

( 4 + 4 + 4 + ((8 * 2) + 2)) * NbRows

しかし、この計算を実際に適用しようとすると、間違っています。私の場合、3,250,273 行あるため、結果は 92 MB になるはずですが、MS SQL レポートは次のように述べています。

(データ) 147 888 KB (インデックス) 113 072 KB および (予約済み) 261 160 KB。

どこが間違っていますか?

4

2 に答える 2

1

残念ながら、テーブルがどのように作成され、データベースがどのように構成されているかについての十分な情報がないため、なぜあなたの計算が間違っているのかはわかりません。だから私は共通して答えようとします、そしてあなたはヒントを得るでしょう.

最初に知っておくべきことは、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を読んでください。それはおそらくあなたにとって興味深いでしょう。

于 2016-12-05T19:21:57.777 に答える