Oracleのインデックス/INDEX(索引)
Oracleのインデックス(索引)とは何でしょうか?
「インデックスとは本に見出しをつけるようなもので、インデックスを使うと速くなります」といっても、ピンとこないと思います。
ちょっとだけ別の話をします。
例えば、「あなたの部屋の中に鍵を隠しました。その鍵を探してください」という難問が与えられたとします(笑)。どうやって鍵を探しますか?
私ならとにかく思いつく限り探します。
- 机の中は?
- カーペットの下は?
- タンスの中は?
- 本の中は?
- 服の中は?
などなど。目に見えるところをすべて探していくので、極めて効率が悪いですね。このような探し方をOracleでは「全件検索」といいます。手当たり次第なので探すまでに時間がかかるのが難点です。
検索がはやくなるインデックス
では、効率のいい探し方はあるのでしょうか?
頭のいい人はこうします。部屋の中央に立って、「ここから右側にありますか?左側にありますか?」と聞きます。右側にあるとしたら、今度は右側の中央に立って「ここから右側にありますか?左側にありますか?」とききます。
これを繰り返すと、どんどんエリアが絞られていき、簡単に探し出せるわけです。これって効率いいですよね?あちこち探し回らずに探す場所をどんどん狭めていく。
「インデックス」とはこんなイメージです。インデックスを使うと、このような効率のいい探し方ができるようになるのです。(実際のインデックスのアルゴリズムではないので気になった方は深堀りしてみて下さい)
インデックスを作成する
Oracleのインデックスのイメージは何となくわいてきたでしょうか?では実際にインデックスを作ってみます。
例えば「通販会社」で考えます。あなたは通販会社のシステムエンジニアです。「キャンセルされた受注データを見たいのに10分以上たたないと表示されない」というクレームがユーザーから来ました。原因としては様々ありますが、このときに有効なものの1つがインデックスです。
インデックスはテーブルの列(カラム)に対して設定します。例えば先ほどの「キャンセルされたデータ」というのが「Jyutyuテーブル」の列「cancel_f」で検索できるとします。遅いのは列「cancel_F」なので、ここにインデックスを設定します。
-- インデックスINDEX_1をJyutyuテーブルのcancel_fに作成する CREATE INDEX INDEX_1 On Jyutyu (cancel_f) TABLESPACE IDXSP;
これで「cancel_f」に対してインデックス「INDEX_1」が設定されました。検索すると数秒程度で表示されるようになります。インデックスを使って「効率のいい検索」ができるようになったので検索時間が改善されたのです。
インデックスは万能ではありません
Oracleのインデックスは素晴らしい機能です。それはそうなのですが、「インデックスを作成すれば必ず速くなる」というわけではありません。「インデックスを作成することによって逆に遅くなる」「インデックスを作成しても速くならない」ケースもあるのです。
一例をあげると、「検索ヒット率が高い」場合はインデックスは有効ではありません。例えば先ほどの受注データの「ほとんど全てキャンセルだったとしたら?」もしそんな通販会社があったらつぶれてしまいますが、例えばあったとします。
これではインデックスを作成しても大幅な速度向上は見込めません。なぜなら「ほとんどのデータがキャンセルされたデータ」ということは、「全体に占める検索結果の割合が大きい」ということです。
それはつまり、「全件検索するのと変わらない」ということになります。結局、全件検索するのならインデックスのメリットがいきません。
このように「インデックスはスピードアップに確かに有効ですが、使い方次第では効果はでない」という側面があるので注意が必要です。
Oracleのインデックス(INDEX)のまとめ
- Oracleのインデックスを使うと検索速度が改善される
- 検索ヒット率が高いとインデックスの効果はでない
以上、Oracleのインデックス(INDEX)のまとめでした。
コメント