- ベストアンサー
検索キーの設定
お世話になっております。 INDEXを設定せずに、検索キーを設定するのですが、以下のデータ型によって検索速度の違いはあるのでしょうか? CHAR(1) VARCHAR2(1) NUMBER(1) また、内部でどのような動きをしているのか、説明が載っているようなHPがありましたら、併せてお教え頂けるとありがたいと思っております。 ご存知な方いらっしゃいましたら、宜しくご教授お願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
CHARとVARCHAR2では、CHARの方が速いということで積極的にCHARを利用する方もいらっしゃいますが、Oracle社はCHARの利用をあまり推奨していません。 また、検索でこれらのデータ型の違いがパフォーマンスに大きく影響を与えることもありません。 結局のところ、扱いやすいデータ型を使うのがよいのではないでしょうか。
その他の回答 (7)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
#4ですが.. 確認しました。 どうも記憶違いしてたみたいですね。 varchar2だけを特別視する必要はなかったです。 勉強になりました。m(__)m
- GoF
- ベストアンサー率37% (34/91)
#5です。 誤) 250Byte以下であればすべての型において1Byte,251Byteを超えると3Byteを 使用していると認識しています。 正)250Byte以下であればすべての型において1Byte,251Byte以上だと3Byteを 使用していると認識しています。 です。
- GoF
- ベストアンサー率37% (34/91)
ご指摘を受けて、確認いたしましたが VARCHAR(1)は 1Byteかと思います。 項目長はカラムヘッダが管理しており、データに含まれません。 250Byte以下であればすべての型において1Byte,251Byteを超えると3Byteを 使用していると認識しています。 参考URLにてご確認ください。
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
#2です。 #1どの宛 NUBERの部分、当方の記憶違いです。(DATE型と取り違い) NUMBER型 = (1 + 切捨て(格納時の桁数/2)) + 1 が正しいようです。(number(1)の場合、2バイト) また、VARCHAR2(1)については、2バイトであっているハズです。 VARCHAR2は、可変バイトで記憶する仕組みのため、レングスを必ず管理します。 レングス部も、格納するデータ値で、1~2バイトの範囲で可変です。 VARCHAR2(1) の場合、1バイトのレングス部と1バイトのデータ値を 管理するので、記憶域として、2バイト消費します。
- GoF
- ベストアンサー率37% (34/91)
#2さんへ 私の認識と異なるので、一応 CHAR(1) = 1バイト (CHAR(1 CHAR)では、また異なります) VARCHAR2(1) = 1バイト NUMBER(1) = 2バイト (※ 負なら3バイトだが、上記2種は表現自体が不可能を考慮) となると思います。 またレコード毎には、レコードヘッダ、列ヘッダが必要(~6Byte)となります。 そのためデータ自体の1Byteの差によるレスポンスへのインパクトは、ほとんどありません。 ちなみに、手元の覚書では NUMBER(n) のサイズは CEIL (n/ 2)+1 +1 ( 最後の +1は負の場合のみ) で桁数により可変となると思います。(間違っているかも)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
データ属性による記憶域の消費量は、 CHAR(1) = 1バイト VARCHAR2(1) = 2バイト NUMBER(1) = 7バイト だったと記憶してます。 なので、1回の物理アクセスで取得できる量が多いのは CHAR(1)である可能性が高いです。 ですが、実際の利用において、大きな差は生まれないと 思います。
- GoF
- ベストアンサー率37% (34/91)
インデックスを使用しない検索は「テーブルフルアクセス」 になります。 テーブルフルアクセスは、検索項目の大きさよりも1レコードの大きさに左右されます。 ですから、通常のレベルでは、3つとタイプで差はでません。 オラクルの動作を知りたいのであれば マニュアル「パフォーマンス・チューニング・ガイド」 ・EXPLAIN PLAN の使用方法 を読んで実際のSQLで解析すると、理解できるようになると思います。 http://www.sint.co.jp/siob/ このあたりのツールを使用すると、実行計画も容易に見ることができます。