sql >> データベース >  >> RDS >> Mysql

SQLvarchar列の長さのベストプラクティス

    私が知っている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 列はパフォーマンスに大きな違いをもたらします。



    1. Oracleデータベースで特定の列名のテーブルを検索しますか?

    2. postgresqlでのROLLBACKイベントトリガー

    3. MySQL WHERE IN()

    4. パート3–顧客、電話、および会議