データベース設計におけるフィールドサイズの過大評価


11

文字列であるテーブル用のフィールドがいくつかありますが、現時点では、ほとんどのフィールドサイズにかなりの文字数制限があります。たとえば、ストリート名は100文字です。大きなフィールドサイズを使用するとペナルティはありますか?たとえば、このフィールドの制限を30文字に変更した場合、サイズによってパフォーマンスが向上するか、効率が向上しますか?収縮の候補となる可能性のある約50のフィールドがあります。

あなたの提案をありがとう。


charの場合、スペースは常にデータベースで使用されますが、varcharの場合、ペナルティは少なくなりますが、操作中に大きなスペースを確保しておく必要があるため、実際に必要なスペースが少し効率的にならない場合もあります。varchar(max)またはvarchar(1000)を常に使用するように、非常に大きくない限り、varchar列について心配する必要はありません。
Cade Roux

パフォーマンスに影響を与えるため、1ページ(8k)のサイズを超えることに注意してください。この記事をチェックアウト:stackoverflow.com/questions/2518922/...

ハードドライブの低コストを考えると、最近のストレージの効率について心配する必要はありません。JNKが言うように、非常に大きなフィールドのインデックス作成には影響があります。割り当てたスペースが少なすぎるためにアプリケーションを変更するのは、データベーステーブルに数バイト余分にかかるコストよりもはるかに大きくなります。
Neville Kuyt

3
安価なのでストレージを無視するのは悪い考えだと思います。ディスク上のすべてのバイトをフェッチして処理する必要があり、ほとんどすべてのSQL Serverインストールで最も遅い部分はディスクストレージです。 バイト数が少ないほどクエリが高速になります。
JNK、2011

1
100MBを使用すると、512MBのディスクコントローラーキャッシュに収まるデータが20%減少する場合、それは絶対に重要です(経験の声)。
エリックJ.

回答:


16

あなたが話している場合varcharnvarchar全くその後、高いフィールドの長さを可能にするためのペナルティはありません。


ただし、次の点に注意してください。

  • 可変長フィールドフィールドごと)の行ごとに2バイトのオーバーヘッドがあります。フィールドが非常に短い場合は、を使用する方が理にかなっていますCHARVarchar(2)たとえば、CHAR(2)常に2を使用しながら、実際には1行あたり2〜4バイトを使用します。
  • 非常に長いフィールドにはインデックスを作成できません。 インデックスキーセットのすべてのフィールドの最大長は900バイトです。
  • 予想よりも多くのデータを許可すると、最終的に予期しない結果が得られます。 通りの名前に100文字を許可すると、ある時点で、気づかずに他のデータがそのフィールドに入る可能性があります(たとえば、住所全体)。適切なサイズの場合、代わりに挿入時にエラーが発生する可能性があります。
  • 非常に広い行を許可すると、ページの分割と断片化が発生する可能性があります。 8kより長い行がある場合、複数のデータページに分割する必要があります。これらの多くは本当にパフォーマンスを低下させる可能性があります。 一般的に狭いほど効率的です。

1
この回答には、短縮にも警告を追加することができます。たとえば、列が少なくとも十分に大きいことを確認してください。アドレスvarchar(30)は、Bolderwood Arboretum Ornamental DriveまたはNortheast Kentucky Industrial Parkwayに対応できません。

@Aleksi-とてもそうです。しかし、私はそれらがより明白であると思います、それがOPが最初に広いフィールドを使用している理由です。
JNK、2011

「ある時点で、他のデータが気付かれずにそのフィールドに入る可能性があります」興味深い点。ユーザーが現在のレコードに該当しないフィールドを汎用コメントフィールドとして使用するシステムをたくさん見ました。


2

「実際に格納されている値よりも大きいフィールドサイズを宣言すると、ペナルティはありますか?」という場合、varcharと宣言されていれば、答えはノーです。私が知っているすべてのSQL DBエンジンは、データで実際に指定された文字数(および長さの値)のみを格納します。したがって、フィールドをvarchar(100)として定義し、その中に10文字しか格納しない場合、ディスク上で10文字しか使用できません(長さは2バイト程度)。疑問がある場合、私は日常的にvarcharフィールドを途方もなく大きくします。

「長い文字フィールドを保存するとペナルティはありますか」という意味であれば、答えは「はい」です。今日のディスク容量は安価ですが、無料ではないので、理由もなくそれを無駄にしたくないでしょう。おそらくもっと重要なことですが、ディスクからデータを読み取るには時間がかかるため、データフィールドが長いほど、プログラムは遅くなります。フィールドにインデックスが付けられている場合、すべての読み取りでキー値をこの大きな長いフィールドと比較する必要があるため、検索が実際に遅くなる可能性があります。

ユーザーにビッグデータ入力フィールドを与えると、遅かれ早かれそのフィールドを使用することに注意してください。

そうは言っても、私は小さすぎるのではなく大きすぎるのではないかと思います。ユーザーが実際のデータを利用可能なフィールドに収めることができないため、ユーザーがその場で略語を発明することを強制したくないほどディスク容量は安価です。私が今日取り組んでいるシステムには、製品の説明フィールドが小さすぎて、製品の実際の名前の多くには小さすぎるため、ユーザーは省略しなければなりません。もちろん、ユーザーごとに略称が異なるため、同じことを言うには20通りの方法があります。


2

実際にテーブルに格納されるものよりも大きいフィールドサイズを宣言してもペナルティがないと主張する人は誰でも間違っています。データの実際のサイズ(およびその2バイトのオーバーヘッド)は実際に格納されるものですが、実行プランに関する限り、見積もりを決定するために使用されるのは列定義です。したがって、10文字の値を格納するようにvarchar(1000)を宣言すると、12文字のディスク領域しか消費されませんが、実行計画の見積もりは、操作を許可するメモリの量とメモリ内でのみ操作を実行できるかどうか、またはtempdbドライブ領域も必要かどうか。列をvarchar(1000)にすることはできますが、エンジンは、格納されているすべての値がvarchar(10)よりも実際に小さいことを認識していません。


0

フィールド長のチェックは「無料」で行うものですCHECK。つまり、同じことを行うために制約を使用する必要はありません。また、同じデータ要素を国際標準住所に沿って35文字に制限している別のデータベースにデータをアップロードする必要がある場合など、サイズが大きすぎるデータ値は必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.