3

私の質問「8060Bデータページ(SQL Server)の8078バイト?」から、MSSQLServerのページあたり8078バイトのデータを取得する方法が説明されました。

インデックス付けされていない固定サイズタイプのレコードの1つの列を持つ1行のみのデータストレージ(オーバーヘッドなし)に使用されるページあたりのバイト数を計算すると(MSDNの記事「ヒープのサイズの推定」に従って)、次のようになります。 〜8087バイト(ページあたり)。

1000ページ以上の本を購入して勉強せずに、行あたり8060バイト(他の質問の回答で言及)および(varchar、nvarchar)あたり8000バイトの制限に到達するにはどうすればよいですか?

私は確かにストレージ割り当てに何かが欠けています:管理するチャンクが少ないほど、オーバーヘッドが多くなります...

4

2 に答える 2

6

ストレージエンジンの内部:レコードの構造

これはSQLServer2005用です

  • レコードヘッダー
    • 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?このテーブルを作成すると警告が表示されます

私はそれにこだわる必要はありません:この情報には実用的な日々の価値がありません

于 2010-09-25T09:44:52.627 に答える
1

何を求めているのか完全にはわかりませんが、「行の最大長が8060バイトで、他の数値ではないのはなぜですか」、または「NVARCHARの最大長が8000バイトであるのはなぜですか」という質問の場合。簡単な答えは、誰が知っていますか?(そしてgbnが言ったように、誰が気にしますか?)

すべてのMSSQLの制限(データ型のサイズ、最大行サイズ、テーブルごとの列、インデックスごとの列など)は、Microsoftによる設計上の決定にすぎません。決定の背後には膨大な量のエンジニアリングドキュメントがあると確信していますが、ほとんどの人はその情報にアクセスできません。

制限とは何か、行サイズの計算方法などの具体的な詳細に興味がある場合は、MSSQLのドキュメントを読むことから始めるのが最適です。

于 2010-09-25T14:12:39.287 に答える