私が知っているDBMSには、VARCHAR
を作成する「最適化」がありません。 2^n
を使用 長さは、max
を使用した場合よりもパフォーマンスが向上します 2の累乗ではない長さ。
初期のSQLServerバージョンは実際にはVARCHAR
を扱っていたと思います 長さ255は、最大長が長いものとは異なります。これがまだ当てはまるかどうかはわかりません。
ほとんどすべてのDBMSの場合、必要な実際のストレージは、max
ではなく、入力した文字数によってのみ決まります。 定義する長さ。したがって、ストレージの観点から(そしておそらくパフォーマンスの観点からも)、列をVARCHAR(100)
として宣言しても違いはありません。 またはVARCHAR(500)
。
max
が表示されます VARCHAR
に指定された長さ 技術的/物理的なものではなく、一種の制約(またはビジネスルール)としての列。
PostgreSQLの場合、最適な設定はtext
を使用することです。 長さの制限とCHECK CONSTRAINT
なし それはあなたのビジネスが必要とするものに文字数を制限します。
その要件が変更された場合、チェック制約の変更はテーブルの変更よりもはるかに高速です(テーブルを書き直す必要がないため)
同じことがOracleやその他にも当てはまります。OracleではVARCHAR(4000)
になります。 text
の代わりに けれど。
VARCHAR(max)
の間に物理ストレージの違いがあるかどうかわかりません および例: VARCHAR(500)
SQLServerで。ただし、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を編集
私はSQLServerについて(少なくとも部分的に)間違っていたようです。 AaronBertrandからのこの回答
を参照してください。 これは、nvarchar
の宣言された長さを示しています またはvarchar
列はパフォーマンスに大きな違いをもたらします。