可変長にするとデータ長を格納する領域が必要です。
性別コードなど1桁の値を格納する列に可変長項目を使用するのは領域の無駄になります。
これはすべてのRDBに共通だと思います。
僕が設計する時は、コードなど決まった桁数ならば固定長のchar型を使用します。
名称、メールアドレスなどの項目のみ可変長の型を使用します。
ご参考までに。
オラクルでは、「最初から設計する場合はぜひVARCHAR2を使って下さいと」記載してあります。
PostgreSQL系でも、パフォーマンスは(text > varchar > char)だと記載されているのを見つけました。
実際にORACLE、PostgreSQL、SQLSERVERでDBの設計をしましたが、char型のメリットは、無いと思います。)
なるほど…やはりそうですよね。まともに考えたら可変長の方がパフォーマンスはいいはずですよね。アーキテクチャをあまり理解していない、古い考え方の人の設計ということなのでしょうかね。
引き続き情報を募集します。DB2,sybase,HiRDB等のDBの情報だとなお嬉しいです。(MySQLは長さによって勝手に決められるのでいりません)
URLはダミーです。
古い考え方だと、固定長データを使う利点は検索速度の向上にあると思います。次のデータを探すとき、決まったオフセットだけずらせばよいわけですから。可変長データだと、まずどこからか長さを取り出して、長さ分だけずらして読まないとダメではないかと。その分遅くなる、というのが20年くらい前の定説でした。今は違うのかなあ。
パフォーマンスといっても、記憶領域のコンパクト化をねらうのか、更新処理の高速化を意識するのか、とにかく速く検索したいのかで違ってくると思います。
>決まったオフセットだけずらせばよいわけですから。
んーなるほど。昔の定説か。記憶媒体の種類やそのアクセス方法にもよるのでしょうね。昔の話は分からないので一概には否定できませんけど、今の構造のHDDだったらchar型が早いという根拠がない気がするんですよね…。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/sq_kj01.htm
SQL 基礎実地編 (その一) テーブル作成、項目タイプ、キー作成、順序作成 - SAK Streets
可変長項目の場合、文字数+文字長管理の領域が必要です。
ですので桁数が決まっている項目の場合、charの方が領域を有効に使うことができます。
理解していただけなかったようですので例を挙げます。
性別コードという項目があり、M:男性、F:女性とコード設計されていたとします。
char(1)の場合、領域は1バイトのみですが、
varchar(1)の場合、データ領域と文字長管理の領域が必要になります。
URLのページはOracleについてということですが、RDB一般についても同様だと考えます。
とは言っても、現在のマシンスペック、ハードディスク容量なら
気にする必要はないかも知れません。
「メリットはあるのでしょうか」ということでしたので、あえて上げてみました。
コメントを拝見しますと、私の回答にご不満なようですのでポイントは結構です。
…確かにそのHPにはそう書いてありますね。また、char型のほうが早いというOracleの公式見解と異なる記述も。内部構造をすべて把握し何度もテストを行った結果であろうOracleの公式見解を上回る根拠を、あのHPからは見出す事は私にはできませんでした。そのHPの記述では、データ領域の話も信憑性が低く感じます。すみません。
http://www.developer.ibm.com/ja/tech/faq/individual?oid=2:23932
IBM notice: The page you requested cannot be displayed
DB2についてです。VARCHAR型は長さデータを格納するために4バイト領域を使用します。そのためvarchar(n)と定義したときにでnの値が小さい場合はchar型のほうが使用領域が少なくなります。可変長データの格納には文字列の長さを保存する領域が必要なためRDB一般的にも極度に短い文字列の場合はchar型のほうが使用領域が少なくなります。
http://www.developer.ibm.com/ja/tech/faq/individual?oid=2:78734
IBM notice: The page you requested cannot be displayed
これはDB2についての話です。
varchar型のデータを更新する場合には文字列の長さの変更によってログレコードが増える可能性があることとページに更新データが入りきらない場合にオーバーフローレコードが発生する可能性があるので必ずvarchar型のほうが効率がよいというわけではありません。
なるほど!これは明快ですね。DB2の場合、条件付でchar型が実行速度をも上回ることがあるんですね。非常に参考になりました。ありがとうございます。
言い忘れましたが、MSのSQLServerについても情報お待ちしています。
ログイン - Yahoo! JAPAN
URLはダミーです。
経験上での話ですが、最近SQLServerやOracleで設計をやっています。
私はCHARは使わず、VARCHARを使っています。
傾向としては、昔から設計をやっている人(COBOL経験者)は、
固定長を使いたがる人が多いようです。
むやみやたらにCHARを使うと、取得後プログラムで
トリムを行わなければならないケースも多く
無駄に面倒な思いをするだけだと思います。
ですよね。「昔(COBOL経験者)の人」「トリム」「無駄」。すべて共感します。ぼくもそう思って質問してます。でもやはり、限定的ながらメリットもあるようですね。そんなメリットを考えながら設計しているわけではないと思いますけど。
でも悪いんですけど、質問と関係ないのでポイント付与対象にはなりません。ご了承ください。
ありがとうございました。
質問は「char型を使用するメリットはあるのでしょうか?」です。領域が無駄になるのは固定長(char型)の場合ではないのですか?すべて空白を入れるのですから。char(10)よりvarchar(10)の方が非効率な根拠が全くありません。varchar(10)では10バイトを超える領域を確保してしまうということがあるのですか?また、すべてのRDBに共通して言える話なのかの記述もありません。
以後の回答では、char型にメリットがあるというのであれば、char(10)よりvarchar(10)の方が非効率な根拠、そして適用範囲のRDBを明記してください。