ようになります任意の「最適化」ありのないDBMS私が知っているVARCHAR
との2^n
長さはとのより良いものより行うmax
2のべき乗でない長さを。
SQL Serverの初期のバージョンでは、実際にVARCHAR
は長さが255のと、最大長がそれよりも長い場合の扱いが異なっていたと思います。これがまだ当てはまるかどうかはわかりません。
ほとんどすべてのDBMSで、必要な実際のストレージは、max
定義した長さではなく、そこに入れる文字数によってのみ決定されます。だから、ビューのストレージポイント(およびおそらくパフォーマンスの一つとしても)から、それはあなたのように列を宣言するかどうかを任意の違いはありませんVARCHAR(100)
かVARCHAR(500)
。
あなたは、表示されるはずmax
のために提供長さVARCHAR
の制約(またはビジネスルール)の一種として、列ではなく、技術的/物理的なものを。
PostgreSQLの場合、最適な設定はtext
、長さ制限なしで使用しCHECK CONSTRAINT
、文字数をビジネスで必要なものに制限することです。
その要件が変更された場合、チェック制約の変更はテーブルの変更よりもはるかに高速です(テーブルを再作成する必要がないため)。
Oracleや他の人にも同じことが当てはまります-OracleではそうでVARCHAR(4000)
はtext
ありません。
VARCHAR(max)
たとえばVARCHAR(500)
SQL Server との間で物理的なストレージの違いがあるかどうかはわかりません。ただしvarchar(max)
、と比較して使用するとパフォーマンスに影響があるようvarchar(8000)
です。
このリンクを参照してください(コメントとしてErwin Brandstetterにより投稿)。
2013-09-22を編集
bigownのコメントについて:
9.2以前のPostgresバージョン(最初の回答を書いたときには利用できませんでした)では、列定義を変更するとテーブル全体が書き換えられました。たとえば、こちらを参照してください。9.2以降、これは当てはまりません。簡単なテストでは、120万行のテーブルの列サイズを増やすのに0.5秒しかかからないことが確認されました。
Oracleにとっても、大きなテーブルのvarchar
列を変更するのにかかる時間から判断すると、これは正しいようです。しかし、そのための参照は見つかりませんでした。
MySQL の場合、ALTER TABLE
マニュアルには「ほとんどの場合、元のテーブルの一時コピーを作成する」と記載されています。そして、私自身のテストALTER TABLE
では、120万行のテーブルで(Postgresを使用した私のテストと同じ)列のサイズを増やすのに1.5分かかりました。ただし、MySQL では、「回避策」を使用してチェック制約を使用し、列の文字数を制限することはできません。
SQL Serverの場合、これに関する明確なステートメントは見つかりませんでしたが、varchar
列のサイズを増やすための実行時間(上記の120万行のテーブル)は、書き換えが行われていないことを示しています。
2017-01-24を編集
SQL Serverについて(少なくとも部分的に)間違っていたようです。a または列の宣言された長さがパフォーマンスに大きな違いをもたらすことを示す、Aaron Bertrandからのこの回答を参照してください。nvarchar
varchar