2011-12-14 3 views
63

は、私は理解:varchar(MAX)は常に望ましいですか? SQL Serverのについて

  • varは、メモリが、それは正確に(挿入時)のデータにフィットする意味を、割り当てられた怠け者であることを意味します。

  • MAXは、サイズ制限\制限がないことを意味します。私たちはとにかく全体のサイズを割り当てていないとして、varcharを使用した場合次に

、常にMAXを使用することが好ましいのですか?

このDB列に適用する制約がある場合のみ、一定のサイズを使用する必要がありますか?

+4

これは、データベース・システムに依存することができます。あなたはどちらを参照していますか? – jjmontes

+0

私の悪い、SQLサーバー –

+1

また、私は、長さの制限がデータモデルの制約の一部であり、そのレベルでも非常に厳しいものが好きな人もいると付け加えたいと思います。 – jjmontes

答えて

51

SOユーザー@Remus Rusanuすることで、このテーマに非常に良い記事があります。ここで私が盗まれましたsnippitはあるが、私は、あなたが全体を読むことをお勧め:

MAXタイプ(varchar型、nvarchar型と varbinary型)を処理するコードパスがその を処理するコード・パスは異なっています等価で非最大長の型。 non-max型は、内部的には通常のポインタと長さの構造体として表される とすることができます。しかし、最大 タイプは、 が2Gbまで成長する可能性があるため、連続したメモリ領域として内部に格納することはできません。したがって、COMのIStreamと同様に、 ストリーミングインターフェイスで表現する必要があります。これは、単純な の割り当てと比較を含む、最大タイプを含むすべての操作が に引き継がれます。これらの操作はストリーミングインターフェイス上ではより複雑なものであるため、 です。最大の影響は、最大タイプ変数(私の最初のテスト)を割り当てて割り当てるコード に表示されますが、すべての操作で の影響が表示されます。

この記事では、varchar(n)を使用するとパフォーマンスが向上することを示すいくつかの例を示します。

記事全体はhereです。良い答えはこちら

+1

またMAXタイプは、少なくともSQL Server 11まで、オンライン操作を妨げます。http://rusanu.com/2011/08/05/online-index-operations-for-indexes -containing-lob-columns / –

11

はここで、マイクロソフトが推奨するものです:列データエントリのサイズが一致している

  • 使用はchar。
  • カラムデータエントリのサイズが大きく異なる場合は、varcharを使用します。
  • カラムデータエントリのサイズが大きく異なり、サイズが8,000バイトを超える場合は、varchar(max)を使用します。

ref

+3

VARCHAR(MAX)をすべて使用しても問題ないと言っているので、私は推測できますか? – HardCode

+1

あなたの現在の編集された回答は、あなたが元の回答を意図したものかどうかにかかわらず、元の回答とは大きく異なります。 – HardCode

+1

最初の答えは間違っていたので、私はそれを落とした。基本的には、varchar(max)をどこでも、いつでも使用しても問題ありません。間違った答えは下降音に値する(そして受け取る)。 – JNK

15

ルック:

Should I use varchar(n) or varchar(MAX)?

短い答えは、ストレージの観点から、それは同じだということですが、クエリの最適化の観点から、それはVARCHAR(N)を使用することをお勧めします。

6

の回答はNOです。 varchar(N)を使用することが常に望ましいです。サイズが変わらないことが分かっている場合は、char(N)を指定します。 MAX型はネイティブSQL機能のほとんどをサポートしていないため、索引を追加したり、結合を実行したり、それらの型に対して効果的な検索を行うことはできません。ちなみに、これがSQL Serverにフルテキスト検索機能が存在する理由の1つです。

さらに、varchar(max)フィールドは、テーブルに含まれるテーブル全体に対してオンライン索引を実行できないようにします。これは、システムのパフォーマンスに大きな影響を与えます。

Varchar(max)は、フィールドのサイズが8Kを超えることがわかっている場合にのみ使用してください。それ以外の場合は、サイズを指定する必要があります。そうしないと設計が貧弱であり、となりますが、ほとんどのシステムでパフォーマンスの問題が発生します。

いくつかの参照:

関連する問題