[解決済み】SQLのvarcharカラムの長さに関するベストプラクティス【クローズド
質問
新しいSQLテーブルをセットアップするたびに、または新しい
varchar
カラムの最適な値は何でしょうか?
length
.
というカラムがあるとします。
name
型の
varchar
. そこで、長さを選択する必要があります。名前 > 20文字というのは考えられませんが、わからないこともないでしょう。しかし、20を使う代わりに、私はいつも次の2^nの数字に切り上げます。この場合、私は32を長さとして選択します。なぜなら、コンピュータサイエンティストの観点からすると、2^nという数字はより多く見えるからです。
even
は他の数よりも、その下にあるアーキテクチャがそれらの数を他の数よりもわずかにうまく処理できると仮定しているに過ぎないのです。
一方、例えばMSSQLサーバーでは、varcharカラムの作成を選択すると、デフォルトの長さの値が50に設定されます。そこで、私は考えてみました。なぜ50なのでしょうか。単なる乱数なのか、それとも平均的なカラム長に基づいているのか、それとも何なのでしょうか。
また、SQLサーバーの実装(MySQL、MSSQL、Postgresなど)が異なると、最適なカラム長の値が異なるということも考えられます(おそらくそうでしょう)。
解決方法は?
私が知っている限り、どの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 の場合、これに関する明確な記述は見つかりませんでしたが、Spoon のサイズを大きくするための実行時間が短縮されました。
varchar
カラム(これも先ほどの120万行の表)を見ると
いいえ
の書き換えが行われる。
編集 2017-01-24
SQL Serverについて、私は(少なくとも部分的に)間違っていたようだ。参照
Aaron Bertrandの回答
の宣言された長さは
nvarchar
または
varchar
カラムを使用すると、パフォーマンスに大きな差が出ます。
関連
-
[解決済み】MySQLのエラーコードです。MySQL WorkbenchでUPDATE中に1175のエラーが発生しました。
-
MySQLとのPython統合でAttributeErrorが発生する: モジュール 'socket' には 'AF_UNIX' という属性がない
-
[解決済み] whereステートメントによるmysqlの一括更新
-
[解決済み] この操作を行うには、少なくとも1つのSUPER権限が必要です。
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] 最初の行への結合方法
-
[解決済み] カラム名の変更 SQL Server 2008
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み】MySQLで正規表現による置換を行うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】MySQLエラー1264:カラムの範囲外の値
-
[解決済み] MySQL エラー: キーの長さがないキー指定
-
[解決済み] WHEREで集計関数は使用できません "というエラーを回避する方法
-
[解決済み] エラー 1049 (42000)。不明なデータベース
-
[解決済み] MySQLの更新datetimeフィールド
-
[解決済み] dpkg: error processing package mysql-server (dependency problems)?
-
[解決済み] 1行目の列 'id' に不正な整数値 '' があります。
-
[解決済み] テーブルがクラッシュしたと判定されたため、修復する必要があります。
-
[解決済み] MySQLの グループ関数の無効な使用
-
[解決済み] DEFAULT NULLとCHECKBOX NULL mysqlの違いは何ですか?