ページとエクステントについて
SQL Serverの基本についてです。開発備忘録では有りませんがとりあえずメモっておきます。
SQL Server のデータ ストレージの基本単位はページです。
エクステントは、物理的に連続する8ページをまとめたもので、すべてのページは、エクステントに格納されます。
[ページ]
ページの概要は以下のとおりです。
・SQL Server では、ページのサイズは 8 KB です。
・ページの先頭には 96 バイトのヘッダーがあり、
ページ番号、ページの種類、ページ上の空き容量、そのページを所有しているオブジェクトのアロケーション ユニット ID
が格納されています。
・ページの種類は、
データ・・・・・・・・・・・・すべてのデータが含まれるデータ行。
インデックス・・・・・・・・インデックスのエントリ。
テキスト/イメージ・・・LOB (ラージ オブジェクト) データ型、データ行が 8 KB を超える場合の可変長データ列
の他、各種マップページやページ空き容量ページが有るそうです。
・データ行はヘッダーの直後から始まり、ページ上に連続的に配置されます。
・ページの末尾から行オフセット テーブルが始まります。
各行オフセット テーブルにはページ上の 1 行につき 1 つのエントリが格納されます。
各エントリには、その行の最初のバイトがページの先頭からどれだけ離れているかが記録されます。
行オフセット テーブル内のエントリは、ページ上の行と逆の順序になっています。
・行は複数のページにまたがることができません。
・更新操作に基づいてレコードが大きくなると、大きなレコードが別のページに動的に移動されます。
・1つのデータ行が 8 KB を超える場合・・・、行の一部をその行のページから移動させます。
基本的に、1レコードが8Kを超えるような大きなデータを扱わない限り、意識する必要は有りません。
が、超えてしまう場合、どうなるのか??
・SQL Server 2008 の varchar 型、nvarchar 型、varbinary 型、sql_variant 型、または CLR ユーザー定義型
の列を含むテーブルでは、この制限が緩和されます。
これらの列の長さは、単独の場合は引き続き 8,000 バイトに制限されますが、組み合わせた場合は 8,060 バイトの
制限を超えることができます。
・組み合わせた長さがこの制限を超えると、データベース エンジンにより、最大幅のレコード列が ROW_OVERFLOW_DATA
アロケーション ユニット内の別のページに移動されます。
元のページには、24 バイトのポインタが維持されます。
・レコードが短くなる更新操作が発生すると、レコードが IN_ROW_DATA アロケーション ユニット内の元のページに移動する
ことがあります。
・varchar(MAX)は最大格納サイズが2Gです。この場合はエクステントをチェインして格納するそうです。
大きなレコードある場合の注意
・行オーバーフロー データを含む大きなレコードで、クエリを実行したり並べ替えや結合などの他の選択操作を実行すると、
処理に時間がかかります。これは、これらのレコードが非同期にではなく同期的に処理されるためです。
・設計時に行オーバーフロー データの多くの行にクエリが頻繁に実行される可能性が高い場合は、いくつかの列を別の
テーブルに移動して、テーブルのサイズを正規化することを検討します。
これにより、非同期結合操作でクエリを行えるようになります。
・クラスタ化インデックスのインデックス キーには、ROW_OVERFLOW_DATA アロケーション ユニットに既存のデータを
持つ varchar 型の列を含めることはできません。クラスタ化インデックスが varchar 型の列に作成され、
既存のデータが IN_ROW_DATA アロケーション ユニットにある場合に、データを行外に押し出すような挿入処理や
更新処理をその列に対して行うと失敗します。
[エクステント]
・エクステントは、DBMSが領域を管理する際の基本単位です。
・1 つのエクステントは物理的に連続した 8 ページ、つまり 64 KB です。
・単一エクステントは、単一のオブジェクトに所有され、所有しているオブジェクトだけがエクステント内の 8 ページすべてを
使用できます。大きなテーブルはエクステントを独占します。
・混合エクステントは最大 8 つのオブジェクトによって共有されます。エクステント内の各 8 ページを、それぞれ異なる
オブジェクトが所有できます。小さなテーブルは、複数で1つのエクステントを共有します。
大きなデータを格納する時はパフォーマンスが悪くなる可能性が有るので、そういう場合は、
・正規化をする。
・LOBデータをファイルシステムに移動
などで、データをコンパクトにすることが肝要です。
なんとなく、まとめてみました。。。