Microsoft SQL Serverでは、データ(インデックスを含む)は、1つ以上の8k(8192バイト)の「ページ」に格納されます。さまざまな状況(たとえば、データ、LOB、索引、AllocationMapなど)を処理するために使用できるさまざまなタイプのページがあります。各ページには、そのページに関するメタデータとその内容が含まれています。
ほとんどのデータは行自体に格納され、これらの行の1つ以上が「行内データ」のページに格納されます。行ヘッダーによって占有されるスペースのため、最大の行は8060バイトです(「行内」データの場合)。
ただし、すべてのデータが行に格納されるわけではありません。ポインタが「イン行」データに残っている間に特定のデータ型のために、データが実際には「LOBデータ」ページ上に格納することができます。誰ももはや使用されるべきではない
レガシー/非推奨LOBタイプ( TEXT
,NTEXT
およびIMAGE
)は、デフォルトでは常にLOBページにデータを格納し、常にそのLOBページへの16バイトのポインタを使用します。
新しいLOB型(VARCHAR(MAX)
、NVARCHAR(MAX)
、VARBINARY(MAX)
、及びXML
)は、デフォルトでは、それが収まる場合行のデータを直接フィットするように試みます。それ以外の場合は、LOBページにデータを格納し、LOBデータのサイズに応じて24〜72バイトのポインタを使用します。
この
は、あなたが一列に
INT
主キー;-)を忘れることができない(78ギガバイト+ 4つのバイトまで保存することができるかです:最大行サイズが940バイト(の間になります(39 * 24)+4)および2812バイト((39 * 72)+4)のようになります。しかし、これもまた最大範囲に過ぎません。 39
VARCHAR(MAX)
フィールドのデータがわずか10バイトの場合、すべてのデータが行内に格納され、行サイズは394バイト((39 * 10)+ 4)になります。
可変長フィールドが非常に多い(MAXであるかどうかに関わらず)ので、将来の行のサイズを見積もる唯一の方法は、このテーブルにどのデータを格納するかを知ることです。すべての、あるいは大部分のMAXデータ型を持つ表が、この表に何が格納されるかについて実際には誰も考えていないことを意味します。
これらの行に沿って、これはひどくモデル化されたMAXデータ型フィールドの恐ろしい使用であり、リファクタリングされるべきであることを指摘しておきます。ページが構成されているデータは、以下のDBA.StackExchangeの質問に私の答えを参照してください方法の詳細については
:
SUM of DATALENGTHs not matching table size from sys.allocation_units
あなたは、このリンク http://stackoverflow.com/questions/を見たことがあります7892334/get-size-of-all-tables-in-database私はあなたを助けるかもしれないことを願っています。 – Timoshenko
現在のサイズを取得したいのですか、特定の行数が追加された場合のサイズの大きさを調べたいですか? –
'VARCHAR(MAX)'や 'VARBINARY(MAX)'のような "大きな"データ型は、他のデータ型とは異なって扱われます。彼らは最大2 GBのデータを持つことができるので、大量のオーバーフローページにまたがる可能性があります。その場合、彼らは 'base 'データページ(これはどこかに書かれています - 今は分かりません)で一定量のストレージを占有し、' int'、 'datetime'などの他のカラムは'ベースページの固定量のストレージ –