ほとんど使用されない Varchar(max) フィールドを持つ Microsoft SQL Server 2008 テーブルがあります。そのフィールドを別のテーブルに移動して、このテーブルを指す方が理にかなっていますか?
または、Varchar(max) フィールドに null が含まれている場合、多くのスペースを占有していませんか?
ほとんど使用されない Varchar(max) フィールドを持つ Microsoft SQL Server 2008 テーブルがあります。そのフィールドを別のテーブルに移動して、このテーブルを指す方が理にかなっていますか?
または、Varchar(max) フィールドに null が含まれている場合、多くのスペースを占有していませんか?
いいえ。SQL Server は、既に BLOB 型に別のアロケーション ユニットを使用しています。テーブルとインデックスの編成を参照してください。NULL 値は、行の 1 ビットのみを占有します。レコードの構造を参照してください。
別のテーブルを作成すると、より多くのスペースが浪費され、列が NULL であるか、値があるかどうかを確認するためのコストが大幅に高くなります。さらに、列の値が最適化され、小さな値が収まる場合は行内に引き出され、大幅に高速なアクセスが提供されます。全体として、エンジンがすでにエンベロープを押し進めているものを、可能な限り効率的にするためにマイクロ最適化しようとしないでください....
テーブルがまばらな場合(つまり、多くの (数百、数千) の列があり、その多くが各行で NULL である)、sparse columnsを使用できます。
http://msdn.microsoft.com/en-us/library/aa224016(v=sql.80).aspxから:
varchar データ型は可変長データ型です。列のサイズよりも短い値は、列のサイズに合わせて右詰めされません
varchar には、長さ + コンテンツのみが含まれます。
null 許容フィールドは、余分なビットを使用して null/非 null 状態を格納するため、レコード自体で余分なスペースが占有されることはありません。