非常に基本的な情報を保持するテーブルがあります。タイトルといくつかの日付フィールドのみ。コメントと呼ばれるvarchar(4000)というフィールドが1つあります。ほとんどの場合、空白のままにしますが、ここに大量のデータを入力することもあります。これは本当に悪いデザインですか?または、これはわずかに非効率ですか?
この列に別のテーブルを作成する方が良いと思います。
注:これはSQL Server 2008です
SPARSE
使用していないSPARSE
...
非常に基本的な情報を保持するテーブルがあります。タイトルといくつかの日付フィールドのみ。コメントと呼ばれるvarchar(4000)というフィールドが1つあります。ほとんどの場合、空白のままにしますが、ここに大量のデータを入力することもあります。これは本当に悪いデザインですか?または、これはわずかに非効率ですか?
この列に別のテーブルを作成する方が良いと思います。
注:これはSQL Server 2008です
SPARSE
使用していないSPARSE
...
回答:
パフォーマンスをより予測可能にするため(およびページごとの行のばらつきが大きくなるのを避けるため)、特にデータが少しの割合でしか取り込まれない場合、特にクエリの一部。この値がある行はNULL
、スペースのオーバーヘッドに寄与しますが、これは最小限です。より重要なのは、1ページが2行にしか収まらず、次のページが500行に収まることです。これは統計に大きな影響を与える可能性があります。コアテーブル。
使用しない場合は最小限のスペースで済みます
オーバーヘッドは最小限であり、最適化は時期尚早です。
問題があることがわかるまで、1つのテーブルに保管してください。外部結合を導入してKISSを破り、データのクエリにオーバーヘッドを追加します。
詳細については、https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265を参照してください
特にそのフィールドに常にデータを入力するわけではない場合は、ページ密度を改善し、断片化を減らすために別のテーブルの方が良いと思います。
これらすべての空のページとポインターは、パフォーマンスの低下につながります。可能であれば、そのフィールドを正規化します。
この質問は非常によく似ています:余分な空の列はsqlテーブルのサイズに大きく影響しますか?
答えは「はい」であるように見えますが、スペースを占有しますが、多くのヌル値を持つ列には圧縮アルゴリズムがあります。
設計に関しては、外部テーブルをこれにリンクすると、よりクリーンな設計になると思います。頻繁にnull値を持つ列があると、データベースのユーザーは注意を怠ると誤ってnull値を使用する可能性があるため、データベースの使用が難しくなります。そのため、データベースを使用するコードにはエラーチェックを含める必要があり、そこから見苦しくなります。
SPARSE
、「多くのnull値を持つ列」だけでなく、として明示的に定義された列にのみ適用されます。
大丈夫です-既にvarchar列であるため、データが含まれている場合にのみスペースを使用します。intのようなNULL可能固定サイズ列が多数ある場合、スペース使用量の問題が発生する可能性があります。
別のテーブルに置く限り、私は気にしません。 また、varchar(max)とin / out of rowオプションを使用することもできます。 繰り返しますが、おそらく時期尚早です。