- - PR -
主キーに最適なデータ型は?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-06-26 07:45
以前はあまり気にしたことがなかったのですが、最近データベースの移行の仕事などを
することがでてきて、ふと思ったのですが、パフォーマンスを考えた際、主キーに 最適なデータ型は何なのでしょうか。(特にマスターテーブルにおいて) 以前、主キーに可変長の文字列を指定していたデータベース(SQL Server)の パフォーマンスが似たようなデータベースで主キーが数値型intのものと 比べてあまりよくなかったので、ずっと数値型を使っているのですが、 パフォーマンスに関する資料を読んでもデータ型に言及しているものはありません。 はたしてマスターテーブルにおける主キーのデータ型はトランザクションテーブルの 外部キーと連結する際にパフォーマンスに影響を及ぼすのでしょうか。 ご存知の方がおられましたら、教えていただけないでしょうか。 | ||||
|
投稿日時: 2004-06-26 11:35
データ型とパフォーマンスは因果関係はうすいと思います。
あったとしても影響力は小さいと思われます理由は値の大小でしか判断していないからです 。パフォーマンスを問題にするのであれば、INDEX設計、テーブル設計のほうが 影響力は大きいです。どうしても気になるのであれば、実測してみるのが一番です。 | ||||
|
投稿日時: 2004-06-26 23:05
インデックスは、指定しているデータ長によって
パフォーマンスが変ります。 よって、可変長文字列の長さ設定がintより長ければ パフォーマンス低下の原因となります。 また固定長文字列と可変長文字列では、DBのプログラムに よっては、微妙なパフォーマンスの差が発生するかもしれません。 (未計測、実質気にする必要無し) パフォーマンスは、挿入、更新時と、読み込み時で異なるので、 必ずしも短くしなければならない訳ではありません。 詳しくはBツリーアルゴリズムと、索引編成ファイル、 区分編成ファイルを理解すると、DBの動作が解ってきます。 | ||||
|
投稿日時: 2004-06-27 02:11
なんか、影響ありそうで、なさそうで、微妙な話題ですね・・。
「主キー」とおっしゃっているのが、PRIMARY KEYを、物理的に実際張っている と仮定すると。検索等は条件が合えば、キーについている索引を使うと思います。 となると、たとえば文字列ですと、DBによっては空白の扱いが違ったりして 違う検索結果が戻ってくることがありますよね? てことは、少なくとも文字列は単純に同値比較をしていないDBもあると いうことになるような気がします。 そうすると、文字列等は数値型に比べて余計なロジックを中で処理することになる、という 仮定が成り立つので,intとかに比べると文字列はパフォーマンスが出ないことが あるのかもしれません。。。 ※ものによっては、キーの索引使わない可能性もある気もしますね・・・。 (そんなこといってたら、固定長と可変長は固定のほうがベターそうな気も) それが無視できる程度かどうか、は実測値を出さないとやはりきびしいのでは?? うーん、むずかしい問題ですね。。考えたこともなかった。 ※でも、主キーに文字列はあんまり使いたくないですよね。。。。気持ち悪いです・・・。 こういう話題が出ると、とても勉強になります。。疑問だけでも皆さん上げてくださると、 この会議室ももっと活気が出るんでしょうね。。。 | ||||
|
投稿日時: 2004-06-27 10:29
七味唐辛子さん、影人さん、檀さんいろいろなご意見ありがとうございます。
> パフォーマンスを問題にするのであれば、INDEX設計、テーブル設計のほうが > 影響力は大きいです。 確かにおっしゃることは確かだと思います。 > 文字列等は数値型に比べて余計なロジックを中で処理することになる、という > 仮定が成り立つので,intとかに比べると文字列はパフォーマンスが出ないことが > あるのかもしれません。。。 実は私もそれが気になっていたのです。 何故なら、文字列の場合大文字、小文字の違い、使用する文字コードによる インデックスの並べ替えロジックの違い、UNICODEの仕様の有無など 単純なintの比較と比べると単純に行かないように思ったのです。 つまり、例え4バイトでもintでしたら、比較としては1回と思いますが、 同じ4バイトでも文字列型でしたら単純なコードの大小だけでは比較できないのではと 思うと文字数分だけの比較が文字列比較のロジックに基づいて発生するのでは 無いかと思えてならないのです。 もしそうだとすると、例え同じ4バイトでも2バイト文字で比較した場合 2回、1バイト文字列で比較した場合4回の比較が発生するのではないか というように感じられたからです。 確かに、トランザクションデータを扱うテーブルの場合、参照自体が一次の場合が 多いのでさほど影響はでなくても、マスターデータを扱うテーブルの場合、 トランザクションテーブルからの二次的な参照が多いため、トランザクション データの数が増えるに従って微妙に影響を与えるのではないかと思えて ならなかったのです。 でも、実際のところどうなんでしょうね。 | ||||
|
投稿日時: 2004-07-01 10:11
PRIMARY KEYであるなら、UNIQUE NOT NULLなので「空白」は入れられないの気にしなくてよいのでは? なお、「空白」は、「違う結果が戻ってくることがある」より、ホワイトスペースではなく、NULLと判断しました。 〜〜〜〜〜 私はシーケンスによってユニークにしやすいので、INTEGERを使っています。 “わかりやすさ”と“実装の容易さ”は、時には“パフォーマンス”に優先すると思います。 | ||||
|
投稿日時: 2004-07-01 10:55
>そうすると、文字列等は数値型に比べて余計なロジックを中で処理することになる、という >仮定が成り立つので,intとかに比べると文字列はパフォーマンスが出ないことが >あるのかもしれません。。。 そうかもしれないですが、今日のCPUパワーから見れば微々たる物だと思います それよりHDのシーク時間 読み込み時間のほうが、桁違いに遅いような | ||||
|
投稿日時: 2004-07-01 12:57
Jittaさん、七味唐辛子さん更なるご意見ありがとうございました。
>そうかもしれないですが、今日のCPUパワーから見れば微々たる物だと思います >それよりHDのシーク時間 読み込み時間のほうが、桁違いに遅いような それはそうですよね。10年前とはマシンパワーも格段と違いますね。 しかし、私がプログラムを始めた頃はZ80の5MHzでメモリが64KBあれば リッチな環境だったのに時代ですねぇ。 何が主キーのデータ型として最適かという結論は各設計者の考えの中にあるとして、 私個人としては基本的に >“わかりやすさ”と“実装の容易さ”は、時には“パフォーマンス”に優先すると思います。 と同意見です。 皆さんご意見ありがとうございました。 [ メッセージ編集済み 編集者: べーちゃん 編集日時 2004-07-01 13:01 ] | ||||
1
