空の列はテーブル内のスペースを占有しますか?


20

非常に基本的な情報を保持するテーブルがあります。タイトルといくつかの日付フィールドのみ。コメントと呼ばれるvarchar(4000)というフィールドが1つあります。ほとんどの場合、空白のままにしますが、ここに大量のデータを入力することもあります。これは本当に悪いデザインですか?または、これはわずかに非効率ですか?

この列に別のテーブルを作成する方が良いと思います。

注:これはSQL Server 2008です

ここに画像の説明を入力してください


皆さんのフィードバックをありがとう!私はそれをシンプルに保ち、テーブルの列を保持し、別のテーブルに配置しないことにしました。ただし、SQL 2008ではSPARSE機能を使用したため、フィールドはスペースを使用しません。

2
好奇心が強い、「ほとんどの時間」とは何ですか?合計行数と、ここで値を持つパーセンテージは何ですか?あなたの使用して、任意のスペース/パフォーマンスの比較を行うにしている計画の場合だけ不思議SPARSE使用していないSPARSE...
アーロンバートランド

回答:


9

パフォーマンスをより予測可能にするため(およびページごとの行のばらつきが大きくなるのを避けるため)、特にデータが少しの割合でしか取り込まれない場合、特にクエリの一部。この値がある行はNULL、スペースのオーバーヘッドに寄与しますが、これは最小限です。より重要なのは、1ページが2行にしか収まらず、次のページが500行に収まることです。これは統計に大きな影響を与える可能性があります。コアテーブル。


12

使用しない場合は最小限のスペースで済みます

  • NULLビットマップの1ビット
  • 長さは2バイト(NULLの場合はゼロになります)

オーバーヘッドは最小限であり、最適化は時期尚早です。

問題があることがわかるまで、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を参照してください


10

特にそのフィールドに常にデータを入力するわけではない場合は、ページ密度を改善し、断片化を減らすために別のテーブルの方が良いと思います。

  • データページは約8000バイトを保持します
  • たとえば、100バイトの行と4000バイトを超える行があります
  • それらの長い行はそれ自体でページ上にあり、ページの残りの部分はDBが占有する「無駄な」スペースですが、おそらくデータを保持することはありません
  • ほぼ満杯のページのレコードの長いフィールドにデータを追加すると、ページがオーバーランし、残りのレコードを含むページへのポインターになる可能性があります

これらすべての空のページとポインターは、パフォーマンスの低下につながります。可能であれば、そのフィールドを正規化します。


4

この質問は非常によく似ています:余分な空の列はsqlテーブルのサイズに大きく影響しますか?

答えは「はい」であるように見えますが、スペースを占有しますが、多くのヌル値を持つ列には圧縮アルゴリズムがあります。

設計に関しては、外部テーブルをこれにリンクすると、よりクリーンな設計になると思います。頻繁にnull値を持つ列があると、データベースのユーザーは注意を怠ると誤ってnull値を使用する可能性があるため、データベースの使用が難しくなります。そのため、データベースを使用するコードにはエラーチェックを含める必要があり、そこから見苦しくなります。


2
明確にするために、圧縮アルゴリズムはSPARSE、「多くのnull値を持つ列」だけでなく、として明示的に定義された列にのみ適用されます。
アーロンバートランド

2

大丈夫です-既にvarchar列であるため、データが含まれている場合にのみスペースを使用します。intのようなNULL可能固定サイズ列が多数ある場合、スペース使用量の問題が発生する可能性があります。

別のテーブルに置く限り、私は気にしません。 また、varchar(max)とin / out of rowオプションを使用することもできます。 繰り返しますが、おそらく時期尚早です。


1
時期尚早の最適化はしばしば現実的な問題になる可能性がありますが、それは後のリファクタリングのコストに依存します。現在、この列にデータがあるのは行の1%だけであり、時間とともにテーブルが大きくなると予想される場合、現在のテーブルにそのデータを永続化すると、スケーリング時に結果が出るだけの価値はありますか?時期尚早な最適化を回避するために私はすべてですが、そうすることの長期的な効果を検討するポイントがあります。
アーロンバートランド

@Aaron Bertrand Agreeed。ここでパフォーマンスの質問をする人は、数百万行のアプリを持っている可能性があり、ツールキット内のすべての武器を使用し、それらすべてを念頭に置く必要があると推測するのは簡単です。一方で、ユーザーは学習曲線の始まりにいるように見える場合があり、優先度が低いと思われるものに時間をかけるように依頼するのは困難です。また、varchar(max)を使用すると、スイッチを効果的にフリックして行外に格納を開始できます。ここでの本当の答えは「決定的な答えを出すのに十分な情報を実際に与えていない」と思います。
ケイドRouxの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.