• ベストアンサー

検索キーの設定

お世話になっております。 INDEXを設定せずに、検索キーを設定するのですが、以下のデータ型によって検索速度の違いはあるのでしょうか? CHAR(1) VARCHAR2(1) NUMBER(1) また、内部でどのような動きをしているのか、説明が載っているようなHPがありましたら、併せてお教え頂けるとありがたいと思っております。 ご存知な方いらっしゃいましたら、宜しくご教授お願いします。

  • kaki3
  • お礼率18% (5/27)
  • Oracle
  • 回答数8
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.8

CHARとVARCHAR2では、CHARの方が速いということで積極的にCHARを利用する方もいらっしゃいますが、Oracle社はCHARの利用をあまり推奨していません。 また、検索でこれらのデータ型の違いがパフォーマンスに大きく影響を与えることもありません。 結局のところ、扱いやすいデータ型を使うのがよいのではないでしょうか。

その他の回答 (7)

回答No.7

#4ですが.. 確認しました。 どうも記憶違いしてたみたいですね。 varchar2だけを特別視する必要はなかったです。 勉強になりました。m(__)m

  • GoF
  • ベストアンサー率37% (34/91)
回答No.6

#5です。 誤) 250Byte以下であればすべての型において1Byte,251Byteを超えると3Byteを 使用していると認識しています。 正)250Byte以下であればすべての型において1Byte,251Byte以上だと3Byteを 使用していると認識しています。 です。

  • GoF
  • ベストアンサー率37% (34/91)
回答No.5

ご指摘を受けて、確認いたしましたが VARCHAR(1)は 1Byteかと思います。 項目長はカラムヘッダが管理しており、データに含まれません。 250Byte以下であればすべての型において1Byte,251Byteを超えると3Byteを 使用していると認識しています。 参考URLにてご確認ください。

参考URL:
http://otndnld.oracle.co.jp/skillup/oracle9i/3_1/index.html
回答No.4

#2です。 #1&#3どの宛 NUBERの部分、当方の記憶違いです。(DATE型と取り違い) NUMBER型 = (1 + 切捨て(格納時の桁数/2)) + 1 が正しいようです。(number(1)の場合、2バイト) また、VARCHAR2(1)については、2バイトであっているハズです。 VARCHAR2は、可変バイトで記憶する仕組みのため、レングスを必ず管理します。 レングス部も、格納するデータ値で、1~2バイトの範囲で可変です。 VARCHAR2(1) の場合、1バイトのレングス部と1バイトのデータ値を 管理するので、記憶域として、2バイト消費します。

  • GoF
  • ベストアンサー率37% (34/91)
回答No.3

#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は負の場合のみ) で桁数により可変となると思います。(間違っているかも)

回答No.2

データ属性による記憶域の消費量は、 CHAR(1) = 1バイト VARCHAR2(1) = 2バイト NUMBER(1) = 7バイト だったと記憶してます。 なので、1回の物理アクセスで取得できる量が多いのは CHAR(1)である可能性が高いです。 ですが、実際の利用において、大きな差は生まれないと 思います。

  • GoF
  • ベストアンサー率37% (34/91)
回答No.1

インデックスを使用しない検索は「テーブルフルアクセス」 になります。 テーブルフルアクセスは、検索項目の大きさよりも1レコードの大きさに左右されます。 ですから、通常のレベルでは、3つとタイプで差はでません。 オラクルの動作を知りたいのであれば マニュアル「パフォーマンス・チューニング・ガイド」 ・EXPLAIN PLAN の使用方法 を読んで実際のSQLで解析すると、理解できるようになると思います。 http://www.sint.co.jp/siob/ このあたりのツールを使用すると、実行計画も容易に見ることができます。

参考URL:
http://otn.oracle.co.jp/document/products/oracle10g/101/doc_cd/index.htm

関連するQ&A

  • 検索スピード

    いつもお世話になっています。 データ型ごとの検索速度の違いについて質問なのですが、 データが数字の「1~6」が入るレコードを単独で検索する際に検索速度を最も早くするには・・・ ・CHAR型(1) ・VARCHAR型(1) ・NUMBER型(1) のどれが一番いいのでしょうか? もちろんインデックスがあるのが前提です。  さすがにこれ以外が一番になることは考えにくいのですが、もしあれば教えて下さい。

  • mysqlのindexとprimary keyについて

    indexキーとprimary keyについてですが、違いというのは、NULLが許可されるか、されないかの違いでしょうか? データベースから検索する際に、indexキーがある方が検索スピードが速いということですが、あるHPに《PRIMARY KEY が宣言されたカラムは自動で Index Key と Unique Key が適応されます》とありました。 ですので、検索スピードを上げるには、PRIMARY KEYを設定すれば、indexキーが設定されたのと同じ事になるのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLの外部キーの設定について

    はじめまして。 質問があります。 MySQLを使用しているのですが、以下を見てください。 ---------------------------------------------------------------- mysql> create table vendors -> ( -> vend_id char(10) NOT NULL, -> vend_name char(50) NOT NULL, -> vend_zip char(10), -> vend_state char(10), -> vend_city char(50), -> vend_address char(50), -> primary key(vend_id) -> ) TYPE=MyISAM; Query OK, 0 rows affected (0.38 sec) mysql> create table products -> ( -> prod_id char(10) NOT NULL, -> vend_id char(10) NOT NULL, -> prod_name char(255) NOT NULL, -> prod_price decimal(8,0) NOT NULL, -> prod_desc blob, -> primary key(prod_id), -> foreign key(vend_id) references vendors(vend_id) -> ) TYPE=MyISAM; Query OK, 0 rows affected (0.05 sec) ---------------------------------------------------------------- 外部キーを設定したつもりなのですが、desc productsを実行すると キーフィールドに「pri」と表示されているので、主キーが 設定されていることが確認できるのですが、外部キーが設定されて いることは確認できません。外部キーは設定されているのでしょうか? もし設定されていないのなら、どのようにすればよいのでしょうか? また、外部キーが設定されていることを確認するにはどうすれば よいでしょうか?ご教授お願いします。

    • ベストアンサー
    • MySQL
  • 検索スピードの速い方法を教えてください

    PostgreSQLを使ったJavaシステムで、検索スピードが最も速い方法を教えていただきたいと思います。 ・検索するテーブル(tblS)  scode Varchar 6 主キー  sname Varchar 30  stni Varchar 2  skmk Varchar 2  stnk Int4 ・検索する項目  入力されたnameがテーブルのsnameに存在した場合、他の4項目のデータを読み込む。  これを連続して5回(nameが5件ある)行う。 現在考えているのが、tblSのデータをArrayListに読込み、ArrayListの検索を行う方法です。 現在、tblSの件数は1500件ですが、日々増加しています。 どうかよろしくご教授ください。

  • Pro*CでVARCHAR2項目の検索

    こんにちは。たぶんとても基礎的なことと思うのですが。。。 Pro*CでSELECTするとき、WHERE句の中でVARCHAR2項目を条件に入れています。 が、どうも検索がうまくできなくて質問しました。 ホスト変数の定義…  char VVV[5]; 検索するところ… select xxx into :yyy from ZZZ where ZZZ.varchar2no4BYTE = :VVV ; のような感じです。ZZZ.varchar2no4BYTEの型はVARCHAR2(4)です。 で、ZZZ.varchar2no4BYTE が"1234"と"12"の2つのレコードを 登録しておいて、VVVに"1234"を入れると、ちゃんと検索できました。 んが、VVVに"12"を入れても検索されません。 そんなのあり?と VVVに"12 "を入れてもだめ、 VVVをVARCHAR構造体?にして、"12"で長さ2にしてもだめ、 だけどZZZ.varchar2no4BYTEがCHAR(4)だと"12"でOK、 なんなんだとPro*Cのマニュアル見てもNUMBER型の検索例ばかり、 というところで力尽きました。 (あー、CHAR_MAP=STRING って関係あるですかね) 動的SQLにすればよいのかもしれませんが、事情で使えないのです。 それ以前にホスト変数の理解が間違っているのではないかと思い、 お聞きするしだいです。

  • 主キーとインデックスの違いについて

    はじめまして。 SqlServerのテーブル作成をしていますが、 主キーとインデックスの違いがよく分かりません。 いつも主キーの設定は行っていますが、インデックスの設定も必要なのでしょうか。(パフォーマンスの向上の為?) 基本的な事ですみませんが ご教授お願いします。

  • 複合キーの設定エラー

    お世話になります。 SQLserver2005 であるテーブルに複合主キーを設定しようとしているのですが以下エラーが出て設定できません。どこの設定を変更すればいいのかご教示いただけれたらと思います。 マネジメントスタジオで対象テーブルのカラム二つを選択し、主キー設定ボタンを押す。 ↓ メッセージ『インデックスまたは主キーのサイズは900バイトまでです』 ★列プロパティのサイズはそれぞれ510となっておりましたがここが原因でししょうか?(二つを足すと900以上だから??しかし変更の仕方も分かりません。1つのカラムだけですと設定できるのですが。。。) ちなみにこのテーブルにインデックスはまだ設定しておりません。 何卒宜しくお願い致します。

  • 検索インデックスの書き方

    Mysqlの検索用のインデックスの書き方を調べているのですが、なかなか見つかりません。 テーブル、customersを作成して、その中に、項目として、 `email` varchar(100) default NULL を定義した場合、 インデックスの付与として、 KEY `idx_customers_email` (`email`) と書いた場合と、 FULLTEXTインデックスの付与として FULLTEXT KEY `email` (`email`) と書いた場合、何が違うのでしょうか? また、このあたりの詳しい説明が載っているサイトとかあれば是非教えてください。

  • phpMyAdminの主キーについて

    phpMyAdminを用いて、MySQLを管理しております。 例えば、 ユーザーid  int ユーザーpw  int ユーザー名  varchar(20) 住所     varchar(30) 電話番号   varchar(10) 備考     text というように管理しております。 上記の場合ですと、主キーはユーザーidにのみ設定したいのですが、 int、varcharのデータ型にすると自動的に主キーが設定されてしまいます。(操作欄で主キーのアイコンがアクティブになる。) textですと主キーになりません。 主キーを解除しようとしますが、 #1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key というメッセージがでて解除できません。 主キーの設定はされていても、自分で主キーを設定したid以外は、同じ値を複数のレコードで保持できるので、問題はないのですが、これはどういう現象なのでしょうか?

    • ベストアンサー
    • MySQL
  • ORA-00959: 表領域'****'は存在しません

    いつもお世話になっております。 既存のSQLスクリプトを流してテーブルを作成しようとしているのですが、 ORA-00959: 表領域'TS_TB_DATA_1M'は存在しません というエラーが出てしまいます。 スクリプトの内容は以下の通りです。 CREATE TABLE tb_mstcom_111 ( trhksk_cd CHAR (6),          ・          ・         途中省略          ・          ・  sishkshnprg_cd VARCHAR2 (30), skj_flg CHAR (1), CONSTRAINT tb_mstcom_111 PRIMARY KEY (trhksk_cd) USING INDEX TABLESPACE ts_ix_data_1m ) TABLESPACE ts_tb_data_1m; 単純なクリエイト文等しか経験したことが無い為、サイトを検索して調べてはみたのですが、初心者の私にはどれも??な感じで困っています。 どなたか原因がわかる方ご教授お願い致します。