ストレージエンジンの内部:レコードの構造
これはSQLServer 2005用です
- レコードヘッダー
- 4バイト長
- 2バイトのレコードメタデータ(レコードタイプ)
- レコード内でNULLビットマップを指す2バイト
- レコードの固定長部分。固定長のデータ型(bigint、char(10)、datetimeなど)を格納する列が含まれます。
- NULLビットマップ
- レコード内の列数の2バイト
- 列がNULL可能かどうかに関係なく、レコードの列ごとに1ビットを格納する可変バイト数(これは、NULL可能列ごとに1ビットのみを持っていたSQL Server 2000とは異なり、単純です)
- これにより、NULLの列を読み取る際の最適化が可能になります
- 可変長列オフセット配列
- 可変長列のカウントに2バイト
- 可変長列ごとに2バイト、列の値バージョン設定タグの最後にオフセットを指定します
- これはSQLServer2005のみであり、タイムスタンプとtempdbのバージョンストアへのポインタを含む14バイトの構造体です
つまり、1文字(8000)
- 4バイト(レコードヘッダー)
- 8000固定長
- 3ヌルビットマップ
- 可変長をカウントするための2バイト
- 14タイムスタンプ
ただし、varchar(200)列が40個ある場合
- 4バイト(レコードヘッダー)
- 0固定長
- 6ヌルビットマップ
- 可変長をカウントするための2バイト
- 202 x 40 =8080
- 14タイムスタンプ
合計=8080+ 4 + 6 + 2 + 14 =8106。WTF?このテーブルを作成すると警告が表示されます
私はそれにこだわるつもりはありません:この情報にはいいえ 実用的な日々の価値