2016-04-23 69 views
2

SQL Server 2008 R2のデータベースサイズを見積もりました。私はINTEGERプライマリキーとVARCHAR(MAX)の39のテキスト列を持つテーブルを持っています。SQL Serverの最大行サイズとVarchar(最大)サイズ

私は2つのステートメントを検索して見つけました。

  • 表には、行ごとに最大8,060バイトを含めることができます。
  • Varchar(max)の最大記憶容量は2ギガバイトです。

サイズを見積もるのは混乱します。行に制限がある場合、どのように各列に2ギガバイトを格納できますか?

私はデータベースの専門家ではないかもしれませんが、正しく取得できません。

誰でも説明できますか?

はあなたに

+2

あなたは、このリンク http://stackoverflow.com/questions/を見たことがあります7892334/get-size-of-all-tables-in-database私はあなたを助けるかもしれないことを願っています。 – Timoshenko

+0

現在のサイズを取得したいのですか、特定の行数が追加された場合のサイズの大きさを調べたいですか? –

+0

'VARCHAR(MAX)'や 'VARBINARY(MAX)'のような "大きな"データ型は、他のデータ型とは異なって扱われます。彼らは最大2 GBのデータを持つことができるので、大量のオーバーフローページにまたがる可能性があります。その場合、彼らは 'base 'データページ(これはどこかに書かれています - 今は分かりません)で一定量のストレージを占有し、' int'、 'datetime'などの他のカラムは'ベースページの固定量のストレージ –

答えて

2

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

1

ありがとうあなたはVARCHAR(MAX)を使用する場合(内容は< 8000バイトであれば)、データは(ページと呼ばれる)の列内に格納することができます。内容が8000バイトを超える場合、データはLOB(「ページ外」)として保管され、実際の場所への参照のみがページ内に保管されます。 Varchar(MAX)の列の長さに関係なく、データベース全体のサイズを見積もる方法については、正直に分かりません。