人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: mady
●カテゴリ:コンピュータ 科学・統計資料
✍キーワード:Char RDB システム メリット
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● hiro55bs
●0ポイント

http://www.sra.co.jp/people/t-ishii/PostgreSQL/old/doc-jp/pgsql-...

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

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

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

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

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

ご参考までに。

◎質問者からの返答

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

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


2 ● god_arrow_k2
●40ポイント

http://www.oracle.co.jp/2shin/2002/ora56/18_19.html

オラクル通信

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

http://ml.postgresql.jp/pgsql-jp-old/pgsql-jp/2000Nov/msg00264.h...

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

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

◎質問者からの返答

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

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


3 ● tom-a
●7ポイント

http://www.hatena.ne.jp/

はてな

URLはダミーです。

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

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

◎質問者からの返答

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

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


4 ● hiro55bs
●3ポイント

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の記述では、データ領域の話も信憑性が低く感じます。すみません。


5 ● amas
●40ポイント

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についても情報お待ちしています。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ