Forum Stats

  • 3,759,183 Users
  • 2,251,510 Discussions
  • 7,870,526 Comments

Discussions

Oracleの索引機能について

998106
998106 Member Posts: 3
edited Mar 21, 2013 8:00PM in データベース一般
いつもお世話になってます。

大変素人質問で申し訳ないのですが、索引機能について個人的に調べており、いくつか疑問が浮かんだ為質問させて下さい。
現在bitmap索引とb*tree索引の機能差を調べています。

①の疑問点
bitmap索引とb*tree索引で解析速度に差がない。
カーディナリティ(値の種類)が増えれば、bitmap索引は動作しなくなり、全表索引に変わるものだと思っていましたが、1千万レコード、カーディナリティを10万にしてもbitmap索引は動作し更にb*tree索引とアクセス速度が変わりませんでした。表に対するupdateなどを行わないと基本的に速度はほぼ同じなのでしょうか?

②の疑問点
1テーブルにName列(一意)とsex列を用意し、1千万レコード挿入しました。
sex列にだけindexを貼り、sex列の500万件を女とし、sex列が女のレコードのみ抜き出す用にしたところ全表走査になってしまいました。
検索対象をsex列のみにしての検索であれば索引が動作するのは確認出来ているのですが、Name列が入ることでなぜ全表走査に切り替わるのかがわかりません
索引は検索対象が多すぎると動作しないとのことですが、それですとカーディナリティが少ないように存在しているbitmap索引の存在価値がないように感じ困っております。。。
※統計情報の再取得は行なっています。

よろしければどなたか、お知恵をお貸し下さい。

使用ツール:OsqlEdit
DB: Oracle Datavase 11g EE
os:win7 64bit
Tagged:

Answers

  • asahide
    asahide Member Posts: 1,095
    ①の疑問点
    bitmap索引とb*tree索引で解析速度に差がない。
    カーディナリティ(値の種類)が増えれば、bitmap索引は動作しなくなり、全表索引に変わるものだと思っていましたが、1千万レコード、カーディナリティを10万にしてもbitmap索引は動作し更にb*tree索引とアクセス速度が変わりませんでした。表に対するupdateなどを行わないと基本的に速度はほぼ同じなのでしょうか?
    こちらは実際のアクセス速度やSQLによっても違うと思いますが、SELECTにおいてはあんまり変わらないみたいですね。
    <<http://www.atmarkit.co.jp/fdb/rensai/orasql09/orasql09_2.html>>
    ②の疑問点
    1テーブルにName列(一意)と***列を用意し、1千万レコード挿入しました。
    ***列にだけindexを貼り、***列の500万件を女とし、***列が女のレコードのみ抜き出す用にしたところ全表走査になってしまいました。
    こちらは結局bitmap索引だけではデータが取り出せないので、そのデータを含めて出力させる場合には全表操作の方が早い、とオプティマイザが判断したのだと思います。


    bitmapとb*treeですが、通常はそのSQLの目的に応じて選ばれるものになると思います。
    b*treeはやはりその索引で絞る、というのに対してbitmapは非定形型のSQLによる結合においても結合条件として利用できるメリットとかがあるのではないかと。
  • 998106
    998106 Member Posts: 3
    asahide様

    素早いお返事ありがとうございますm(_)m

    こちらは結局bitmap索引だけではデータが取り出せないので、そのデータを含めて出力させる場合には全表操作の方が早い、とオプティマイザが判断したのだと思います。
    オプティマイザが全表走査の方が早いと判断した理由を数値などで見ることはできないでしょうか?
    全表走査はマルチブロックリードで、索引はシングルブロックリードで読み込みに差があるということだけは理解出来ているつもりです。
    ですが、そもそも1ブロックに何行入っているかを確かめる方法がわからず、なぜオプティマイザがこのような判断をしたのか解らず悩んでおります。
    bitmapとb*treeですが、通常はそのSQLの目的に応じて選ばれるものになると思います。
    b*treeはやはりその索引で絞る、というのに対してbitmapは非定形型のSQLによる結合においても結合条件として利用できるメリットとかがあるのではないかと。
    申し訳ありません、『索引で絞る』という言葉はイメージが付くのですが、非定形型SQLというのはどのようなものなのでしょうか?
    @ITの http://www.atmarkit.co.jp/fdb/rensai/javadb04/javadb04_2.html こちらのサイトを読んでみましたがあまりイメージが沸かず・・・。
    質問ばかりで、大変申し訳ありませんがよろしくお願いします。
  • asahide
    asahide Member Posts: 1,095
    オプティマイザが全表走査の方が早いと判断した理由を数値などで見ることはできないでしょうか?
    全表走査はマルチブロックリードで、索引はシングルブロックリードで読み込みに差があるということだけは理解出来ているつもりです。
    ですが、そもそも1ブロックに何行入っているかを確かめる方法がわからず、なぜオプティマイザがこのような判断をしたのか解らず悩んでおります。
    explain plan辺りでコストがどのくらい、と見積もられているかは確認できると思います。
    #たぶんそのレベルまでしか確認できないと思いますが、、
    bitmapとb*treeですが、通常はそのSQLの目的に応じて選ばれるものになると思います。
    b*treeはやはりその索引で絞る、というのに対してbitmapは非定形型のSQLによる結合においても結合条件として利用できるメリットとかがあるのではないかと。
    申し訳ありません、『索引で絞る』という言葉はイメージが付くのですが、非定形型SQLというのはどのようなものなのでしょうか?
    @ITの http://www.atmarkit.co.jp/fdb/rensai/javadb04/javadb04_2.html こちらのサイトを読んでみましたがあまりイメージが沸かず・・・。
    SELECTのWHERE句が動的に変更されるようなSQLのことを指しました。
    いわゆる自由検索型のSQLになります。
    SELECT c1, c2 ,c3 ... FROM tab1, tab2 ..
    WHERE condition1 and condition2 ..
    のようにWHERE句の中の検索条件を自由に設定できるようなSQLです。
    主としてDWHでよく使われます。
  • 998106
    998106 Member Posts: 3
    explain plan辺りでコストがどのくらい、と見積もられているかは確認できると思います。
    #たぶんそのレベルまでしか確認できないと思いますが、、
    Cost値は測定していたのですが、参考書を読む限りカーディナリティが低くい表にbitmapを使えば早くなる!という記述が多かった為、あまり信用していませんでした。
    ある意味解答は既に知っていたということですね。
    SELECTのWHERE句が動的に変更されるようなSQLのことを指しました。
    いわゆる自由検索型のSQLになります。
    SELECT c1, c2 ,c3 ... FROM tab1, tab2 ..
    WHERE condition1 and condition2 ..
    のようにWHERE句の中の検索条件を自由に設定できるようなSQLです。
    主としてDWHでよく使われます。
    java等を用いずsqlだけで動的に変更されるようなものが作成出来るとは知りませんでした。
    DBについて学び初めて数ヶ月で知らないことだらけですが、1つ謎が解けた気がします。
    ありがとうございました。
  • asahide
    asahide Member Posts: 1,095
    java等を用いずsqlだけで動的に変更されるようなものが作成出来るとは知りませんでした。
    動的SQL で確認すれば色々と出てくると思いますが、基本はアプリ側でSQLを静的にGENERATEしているか、動的にGENERATEしているかの違いだけだと思います。。
This discussion has been closed.