• ベストアンサー

インデックスの作成

インデックスを複数作成する理由がわかりません。 TESTテーブルにA,B,C,Dという項目があった場合、 TEST_IDX(A,B,C,D)のように作ってしまえば、いずれの 項目にもインデックスが貼られているので、それでOK というわけにはいかないのでしょうか? 例えばインデックスを 1.TEST_IDX_1(A,B) 2.TEST_IDX_2(B,C) 3.TEST_IDX_3(D) のように作成する理由とは何でしょうか?

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

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

> 例えばインデックスを > 1.TEST_IDX_1(A,B) > 2.TEST_IDX_2(B,C) > 3.TEST_IDX_3(D) > のように作成する理由とは何でしょうか? (A,B,C,D)として作成されたインデックスは A が検索条件に含まれず、B,C しか条件にないときには役に立たないからです。(INDEX SKIP SCAN にはあえて触れません) これは索引の構造を考えていただければすぐに分かると思います。 例えば、'いろはに' と言う文字列を辞書の索引で探すときに、まず「い」で始まるものを探して、その中で「ろ」で始まるものを探して、さらにその中で「は」で始まるものを探して「に」で終わるものを探すでしょう。そうすると目的のページに行き着けるわけですね。 でも、'○ろは○' という文字列を文字列を辞書の索引で探すときどうしますか? 索引が全く役に立たず、結局全部のページを見て行くしかないことが分かりますよね。それは、最初の文字が分からないから、絞込みが効かないためですね。 そこで、2番目と3番目の項目だけの値を含む索引があればどうでしょう。2番目が「ろ」で3番目が「は」であるページを探すことで、ある程度ページを絞り込むことができますね。 これが > 2.TEST_IDX_2(B,C) という索引にも意味があるという理由になります。

shun10
質問者

お礼

ご回答に対する御礼が遅れてしまい、申し訳ございません。 非常に分かりやすいご回答をいただき、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.2

必要な全ての項目を網羅する索引を持ったとして・・ 例えば、A+B+C+Dという索引から、B,Cだけを条件に 絞り込み行う場合、索引全体を探査する必要があります。 なので、標準的なオラクルの索引処理では、A+B+C+Dの 索引を使わない方向でプランニングされます。 但し、9iシリーズから、INDEX SKIP SCANという機能で 上記のような索引であっても、索引を使った検索が可能です。 効率については、良くないのは、明白ですが.. 索引保守と検索効率の比重によっては、有用な機能だと 思います。 (全表検索より、INDEX SKIP SCANの方が良い場合であればですが・・)

shun10
質問者

お礼

ご回答に対する御礼が遅れてしまい、申し訳ございません。 ご回答をいただき、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

インデックスの数と検索スピードの違いでしょう。 (A,B,C,D)だと最大A×B×C×Dの数のインデックスができます。 (A,B)、(B,C)、(D)だとA×B+B×C+Dですみます。

shun10
質問者

お礼

ご回答に対する御礼が遅れてしまい、申し訳ございません。 非常に分かりやすいご回答をいただき、ありがとうございました。 検索スピードがどのように違ってくるのか、自分でも調べてみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • postgres table作成時にindex付与

    MySQLでは以下のようにテーブル作成時にインデックス付与ができます。 CREATE TABLE test ( a int(11) NOT NULL DEFAULT '0', b int(11) DEFAULT NULL, PRIMARY KEY (a), KEY test_idx (b), -- ★インデックス その1 KEY test_idx2 (a) -- ★インデックス その2 ); ポスグレではできませんか?

  • PRIMARYKEYとINDEX その2

    あるテーブルのPRIMARYKEYとして, A,B,Cの3項目この順で指定しました。 ところがこのテーブルをA単独で検索することが あります。 この場合,A単独でINDEXを作成したほうが良いでしょうか? それともPRIMARYKEYで作成したINDEX(A,B,C)で事足りるでしょうか? また初歩的な質問になるかと思いますが, 宜しくお願いします。

  • テーブル定義書作成時のIndex付加について

    基礎的なことで申し訳ございませんが、 お力添えよろしくお願いいたします。 CentOs 5 & PostgreSQL 8.4.9にてDB構築しております。 DB構築から、テーブル作成・項目追加・キー設定まで行いまして、 検索する際に、抽出件数が多く負荷のかかりそうなものに Indexを作成しようと考えております。 ■本題  1.Indexを作成する対象となる項目の、目安としてどのようなものが考えられるでしょうか。   ・キー対象の項目になっているもの   ・検索条件の対象となる項目なども当たるでしょうか  2.項目をまとめて一つのIndexにするメリット・デメリットはどのようなものでしょうか   3.テーブル結合したときのIndexの動作    例) 下記のようなテーブルがあった場合 tablea(データ50000件程度) hoge_id pkey1 hoge_no hoge_nm ... tableb(データ150000件程度) test_id pkey1 hoge_id pkey2 hoge_betu_kb ...     select t1.hoge_id, t1.hoge_nm, t2.hoge_betu_kb rom tablea as t1 leftjoin tableb as t2 on t1.hoge_id = t2.hoge_id where t1.hoge_id > '100' and t1.hoge_nm like 'あいう%'   このような場合のIndex作成は、 A. Create index idx_tablea_hoge_id ON tablea (hoge_id); B. Create index idx_tablea_hoge_id ON tablea (hoge_nm); C. Create index idx_tableb_hoge_id ON tableb (hoge_id); ←tableaで指定しているのでこれは不要?  4.A.B.C.のようなIndex作成した際のテーブル定義の書き方   テーブル定義書のフォーマットは定められており、お門違いな質問かとは存じてはおりますが、   テーブル定義にIndex定義を書く場合に、添付した画像のようなフォーマットの書き方が   よく理解できずお気づきの点などございましたら、ご指摘願えたら助かります。   (以前は、CSEツールなどで自動出力される定義書のような書き方をしていたもので・・・)         例)tablea IDX1 IDX2 IDX3 hoge_id 1 hoge_nm 2 このような書き方になるのかどうか?      IDX2, IDX3の項目とは?どのようなIndex定義をした際に書き込むことになるのかが判らず。。。      基礎から勉強しなおすべきとは存じておりますが。。。 現状の期間あまり時間がないことと、 DB構築を一人で行っており、このような内容を相談できるものがおりませんゆえ、 改めて、Index付加することを考えてみると、いまさら聞けないような内容かもしれませんが ちゃんと把握したうえで、テーブル構築したいと思いますので 今までの他の皆様の経験からのノウハウなども踏まえて、 ご教授いただけると大変助かります。

  • 効率的なインデックスのつけ方は?

    効率的なインデックスのつけ方は? MYSQLでのインデックスのつけ方をご教授して頂けますでしょうか? ・データ数とかその他もろもろにもよるかと思いますが、一般的に考えてってことでよろしくお願いいたします。 以下のようなテーブル定義があったとします。 CREATE TABLE TEST_TBL ( C1 VARCHAR(10) NOT NULL, C2 VARCHAR(10) NOT NULL, C3 VARCHAR(10) NOT NULL, C4 VARCHAR(10) NOT NULL, PRIMARY KEY (C1) ) 検索条件としては、 ・(C1) ・(C2) ・(C3) ・(C4) ・(C1,C2) ・(C1,C3) ・(C1,C4) ・(C2,C3) ・(C2,C4) ・(C3,C4) ・(C1,C2,C3) ・(C1,C2,C4) ・(C1,C3,C4) ・(C2,C3,C4) ・(C1,C2,C3,C4) と言うような、すべての場合の条件があるとします。 それぞれの検索条件の頻度は同程度とします。 この場合、どのINDEXとどのINDEXを作成するがベターなのでしょうか? 1. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1); 2. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2); 3. CREATE INDEX TEST_IDX1 ON TEST_TBL (C3); 4. CREATE INDEX TEST_IDX1 ON TEST_TBL (C4); 5. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2); 6. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3); 7. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C4); 8. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3); 9. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C4); 10.CREATE INDEX TEST_IDX1 ON TEST_TBL (C3,C4); 11.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3); 12.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C4); 13.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3,C4); 14.CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3,C4); 15.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3,C4);

    • ベストアンサー
    • MySQL
  • SQL INSERT文を作成したいのですが

    お世話になります。 INSERT文を作成したのですが条件が多すぎて難しいです。 教えてください。 ・AテーブルにB・C・D・Eテーブルを元にデータを抽出しINSERT処理をしたいです。 ・データはBテーブル(親)の項目1が'10'の場合 ・結合条件はCテーブル(子)=B.項目2 = C.項目2 Dテーブル(子)=B.項目2 = D.項目2 Eテーブル(子)=B.項目2 = E.項目2 アドバイスをよろしくお願いします。          

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

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

  • Oracleのindex作成のポイントに付いての質問。

    こんにちは。 Oracleのindex作成のポイントに付いて質問させて頂きます。 テーブルAに対して、インデックスAと言う名称のINDEXを作成するとします。 テーブルAの項目はP1,A1,A2,A3,A4と言う5ケの項目より成り立ちます。 (P1はテーブル作成時のプライマリーキーです。) 今、プログラム1・プログラム2・プログラム3からテーブルAのデータを利用していますが、速度が遅くそのためインデックスAを作成して改善するところです。 プログラム1では、A1,A2,A3をキーとしてデータを読み込んでいます。プログラム2ではA1とA4、プログラム3ではA1をキーとして読みこんでいます。 優先順位は、プログラム1が第1優先、プログラム2が第2優先、プログラム3が第3優先です。 システムに負荷を掛けたくないと言う理由からインデックスは1ケのみ作成するとします。 キー項目としては、どれを選定するべきでしょうか? 1)A1 2)A1,A2,A3 3)A1,A2,A3,A4 1)は汎用性があるように思えますが? 2)でプログラム1を優先させて、同時にプログラム2・3にもこのINDEXは適用されるのでしょうか? それとも、全てを網羅した3)を使うべき? ご経験者の方宜しくお願い致します。

  • 最適なインデックス作成

    いつもお世話になってます。 下記のSQLがあるとします。 SELECT A.COL3, A.COL4, B.COL5, SUM(A.COL6) -- (5) FROM TABLE1 A INNER JOIN TABLE2 B ON A.COL1 = B.COL1 -- (2) WHERE -- (1) A.COL1 = '1' AND A.COL2 = '2' GROUP BY A.COL3 ,A.COL4 -- (3) ORDER BY A.COL3, A.COL4 -- (4) 番号はSQLが内部処理(絞りこみやソート)される順番とも考えています。 この場合にてインデックスを作成する場合 「TABLE1 A」に IND1(A.COL1,A.COL2,A.COL3,A.COL4,A.COL6) ON TABLE1 の複合インデックスを作成すべきか、それとも番号単位に個別に索引を作成した方が良いのか悩んでいます。 番号単位だと例えば IND1(A.COL1,A.COL2) IND2(A.COL3,A.COL4) IND3(A.COL6) アドバイスなどあればよろしくお願いします。

  • ACCESS2003:サブフォームに他のテーブルの項目を表示

    ACCESS2003:サブフォームに他のテーブルの項目を表示 現在メインフォームの中にサブフォームを組み込んでいます。 [前提条件] ※1 サブフォームの参照テーブルを仮にテストテーブルとします。 ※2 サブフォームの項目をA,B,C,Dの4項目とします。 ※3 テスト1テーブルの項目はA,B,Cの3項目とします。 ※3 テスト2テーブルの項目はA,D,Eの3項目とします。 その場合、A,B,Cはテスト1テーブルの内容をそのまま表示するので問題ないのですが、 D,Eの項目はテストテーブルに存在しないので、Aをキーにしてテスト2テーブルから データを取得して表示したいのです。 初歩的な質問で申しわけありませんが、ご回答を宜しくお願いします。

  • DBリンク&シノニム経由インデックス

    Oracle8iサーバ(サービス名:Aサーバ)と Oracle10gサーバ(サービス名:Bサーバ)があります。 Aサーバに作られた、aスキーマに、test_tableというテーブルがあります。 そのtest_tableをBサーバに作られた、bスキーマから参照する為に、 DBリンク:BA_linkを作成しました。 実際に、bスキーマから参照する場合は、 同スキーマに、 CREATE SYNONYM test_table FOR test_table@BA_link; のように作られたシノニムを利用して、参照します。 抽出に時間がかかるので、インデックスを作成しようと思うのですが、 どのスキーマにどのように作成すればよいのでしょうか? ちなみにインデックスの対象にしたい項目は、 VAR_ITEM VARCHAR2(10) NUM_ITEM NUMBER(5) とします。 ちなみにbスキーマにて、 CREATE INDEX test_table_IX1 ON test_table (VAR_ITEM, NUM_ITEM); と実行したところ、 ORA-02021: リモート・データベースに対するDDL操作が無効です・ というエラーが発生しました。 DBリンク先自身に、作成すべきということはなんとなく予想が つくのですが、そのインデックスはDBリンク経由でも有効なのでしょうか?