RDBにおいて項目設定をする際、varcharやtext型などの可変長の型ではなく、char型を使用するメリットはあるのでしょうか?システム的に空白を入れることが必要な場合はあたりまえですが、そうでない場合でもchar型を使用することがあるので。※回答には、すべてのRDBに共通して言えることなのか、個々のRDBによって異なる話なのかの明記をお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2003/12/18 16:52:13
  • 終了:--

回答(6件)

id:hiro55bs No.1

hiro55bs回答回数11ベストアンサー獲得回数02003/12/18 17:25:15

可変長にするとデータ長を格納する領域が必要です。

性別コードなど1桁の値を格納する列に可変長項目を使用するのは領域の無駄になります。

これはすべてのRDBに共通だと思います。

僕が設計する時は、コードなど決まった桁数ならば固定長のchar型を使用します。

名称、メールアドレスなどの項目のみ可変長の型を使用します。

ご参考までに。

id:mady

質問は「char型を使用するメリットはあるのでしょうか?」です。領域が無駄になるのは固定長(char型)の場合ではないのですか?すべて空白を入れるのですから。char(10)よりvarchar(10)の方が非効率な根拠が全くありません。varchar(10)では10バイトを超える領域を確保してしまうということがあるのですか?また、すべてのRDBに共通して言える話なのかの記述もありません。

以後の回答では、char型にメリットがあるというのであれば、char(10)よりvarchar(10)の方が非効率な根拠、そして適用範囲のRDBを明記してください。

2003/12/18 17:50:13
id:god_arrow_k2 No.2

god_arrow_k2回答回数88ベストアンサー獲得回数02003/12/18 17:26:50

ポイント40pt

オラクルでは、「最初から設計する場合はぜひVARCHAR2を使って下さいと」記載してあります。

PostgreSQL系でも、パフォーマンスは(text > varchar > char)だと記載されているのを見つけました。

実際にORACLE、PostgreSQL、SQLSERVERでDBの設計をしましたが、char型のメリットは、無いと思います。)

id:mady

なるほど…やはりそうですよね。まともに考えたら可変長の方がパフォーマンスはいいはずですよね。アーキテクチャをあまり理解していない、古い考え方の人の設計ということなのでしょうかね。

引き続き情報を募集します。DB2,sybase,HiRDB等のDBの情報だとなお嬉しいです。(MySQLは長さによって勝手に決められるのでいりません)

2003/12/18 17:54:43
id:tom-a No.3

tom-a回答回数12ベストアンサー獲得回数02003/12/18 18:29:06

ポイント7pt

 URLはダミーです。

 古い考え方だと、固定長データを使う利点は検索速度の向上にあると思います。次のデータを探すとき、決まったオフセットだけずらせばよいわけですから。可変長データだと、まずどこからか長さを取り出して、長さ分だけずらして読まないとダメではないかと。その分遅くなる、というのが20年くらい前の定説でした。今は違うのかなあ。

 パフォーマンスといっても、記憶領域のコンパクト化をねらうのか、更新処理の高速化を意識するのか、とにかく速く検索したいのかで違ってくると思います。

id:mady

>決まったオフセットだけずらせばよいわけですから。

んーなるほど。昔の定説か。記憶媒体の種類やそのアクセス方法にもよるのでしょうね。昔の話は分からないので一概には否定できませんけど、今の構造のHDDだったらchar型が早いという根拠がない気がするんですよね…。

2003/12/19 10:17:42
id:hiro55bs No.4

hiro55bs回答回数11ベストアンサー獲得回数02003/12/18 19:51:25

ポイント3pt

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一般についても同様だと考えます。

とは言っても、現在のマシンスペック、ハードディスク容量なら

気にする必要はないかも知れません。

「メリットはあるのでしょうか」ということでしたので、あえて上げてみました。

コメントを拝見しますと、私の回答にご不満なようですのでポイントは結構です。

id:mady

…確かにそのHPにはそう書いてありますね。また、char型のほうが早いというOracleの公式見解と異なる記述も。内部構造をすべて把握し何度もテストを行った結果であろうOracleの公式見解を上回る根拠を、あのHPからは見出す事は私にはできませんでした。そのHPの記述では、データ領域の話も信憑性が低く感じます。すみません。

2003/12/19 10:37:02
id:amas No.5

amas回答回数12ベストアンサー獲得回数02003/12/18 23:28:52

ポイント40pt

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型のほうが効率がよいというわけではありません。

id:mady

なるほど!これは明快ですね。DB2の場合、条件付でchar型が実行速度をも上回ることがあるんですね。非常に参考になりました。ありがとうございます。

言い忘れましたが、MSのSQLServerについても情報お待ちしています。

2003/12/19 10:42:28
id:kacchan6 No.6

kacchan6回答回数106ベストアンサー獲得回数02003/12/19 09:18:43

http://my.yahoo.co.jp/

ログイン - Yahoo! JAPAN

URLはダミーです。

経験上での話ですが、最近SQLServerやOracleで設計をやっています。

私はCHARは使わず、VARCHARを使っています。

傾向としては、昔から設計をやっている人(COBOL経験者)は、

固定長を使いたがる人が多いようです。

むやみやたらにCHARを使うと、取得後プログラムで

トリムを行わなければならないケースも多く

無駄に面倒な思いをするだけだと思います。

id:mady

ですよね。「昔(COBOL経験者)の人」「トリム」「無駄」。すべて共感します。ぼくもそう思って質問してます。でもやはり、限定的ながらメリットもあるようですね。そんなメリットを考えながら設計しているわけではないと思いますけど。

でも悪いんですけど、質問と関係ないのでポイント付与対象にはなりません。ご了承ください。

ありがとうございました。

2003/12/21 16:37:17

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

  • RDBのcharとvarchar Javaじゃないですが、、、 論理的な意味を物理にも適用し、固定長な項目=char、可変長な項目=varchar/varchar2と定義しますが、これは正しいのでしょうか?と考える機会があり
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません