厳密に言えば、MAX
タイプは常に非MAXタイプよりも少し遅くなります。varchar(max)とvarchar(N)のパフォーマンスの比較を参照してください。しかし、この違いは実際には決して目に見えません。IOによって駆動される全体的なパフォーマンスのノイズになるだけです。
あなたの主な関心事は、MAXと非MAXのパフォーマンスであってはなりません。この列に8000バイト以上を格納する必要がある可能性があるという質問に注意する必要がありますか?答えが「はい」の場合、「はい」の可能性が非常に低い場合でも、答えは明らかです。MAXタイプを使用すると、後でこの列をMAXタイプに変換する手間は、非MAXタイプのパフォーマンス上のわずかなメリットに値しません。 。
その他の懸念事項(その列にインデックスを付ける可能性、MAX列を持つテーブルのONLINEインデックス操作が利用できないこと)は、Denisの回答によってすでに対処されています。
ところで、オーバーフロー領域にデータが残っている4KBを超える列に関する情報は間違っています。正しい情報は、テーブルとインデックスの編成にあります。
ROW_OVERFLOW_DATAアロケーションユニット
テーブル(ヒープまたはクラスター化テーブル)、インデックス、またはインデックス付きビューで使用されるパーティションごとに、1つのROW_OVERFLOW_DATAアロケーションユニットがあります。このアロケーションユニットには、IN_ROW_DATAアロケーションユニット内の可変長列(varchar、nvarchar、varbinary、またはsql_variant)のデータ行が8KBの行サイズ制限を超えるまでゼロ(0)ページが含まれます。サイズ制限に達すると、SQL Serverは、最大幅の列をその行からROW_OVERFLOW_DATAアロケーションユニットのページに移動します。この行外データへの24バイトのポインターは、元のページに保持されます。
つまり、4KBを超える列ではなく、ページの空き領域に収まらない行であり、「残り」ではなく、列全体です。