- 締切済み
ORACLE 索引検索について
ORACLE初心者で索引について勉強しています。 そこでORACLEの索引(Bツリー)検索について2点程質問させていただきます。 (1)索引を用いるとI/O処理が少なくなりアクセスが高速になるということはわかったのですが、そのI/O処理とはプロセスとメモリ間のやりとりに関するI/O処理という認識で間違いないのでしょうか? (2)索引付きと索引なしのカラムを抽出条件にして検索した場合、まず索引付きのカラムから検索を行い、そのROWIDを元に索引なしのカラムのデータを取得して対象データかどうかの判断を行うのでしょうか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Siegrune
- ベストアンサー率35% (316/895)
(1)索引を用いるとI/O処理が少なくなりアクセスが高速になるということはわかったのですが、そのI/O処理とはプロセスとメモリ間のやりとりに関するI/O処理という認識で間違いないのでしょうか? プロセスとディスク(またはキャッシュされたメモリ)との間のI/O処理 というほうがあっていると思うのですが。 ・・・「プロセスとメモリ間」というと正しくないようにしか聞こえませんが、 たまたま、すべてメモリにキャッシュされていると、ディスクアクセスがなかったりするので 完全な間違いとは言い切れないけど、大抵の場合は間違い、って思います。 (2)索引付きと索引なしのカラムを抽出条件にして検索した場合、まず索引付きのカラムから検索を行い、そのROWIDを元に索引なしのカラムのデータを取得して対象データかどうかの判断を行うのでしょうか? >まず索引付きのカラムから検索を行い、そのROWIDを元に索引なしのカラムのデータを取得して のパターンは、RangeScanというタイプになり、Oracleがそれが早いと判断したら、そういう処理が 動きます。 「そのROWIDを元に索引なしのカラムのデータを取得して対象データかどうかの判断」をするのか 「索引付きのカラムから対象を抽出して、抽出したデータ(select句内の項目と where句内の項目などなのか詳細不明)から索引なしのカラムのデータが一致する 物のみに絞り込んでいる」のかは不明。(Oracle内部の処理仕様の話なので。。。)
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ > I/O処理とはプロセスとメモリ間のやりとりに関するI/O処理 目的のデータに辿り着くまでのDisk I/O の事です。 索引は内部的にキー項目でソートされているため、目的のデータに 辿り着くまでの読込み量を減らせる訳です。 > 索引付きと索引なしのカラムを抽出条件にして検索した場合 これは状況によります。 索引のアクセスと、ROWID からのデータへのアクセスは1ブロックづつ 読込み処理が行われます。 これに対して、索引を使わないFull Scan は複数ブロックづつまとめて 読込みが行われます。 そのため、テーブルのサイズが小さい場合は、索引を使うよりもFull Scan させた方が高速な場合があります。 もう1つ、B-Tree 索引の場合大量のデータの中から少ない件数のデータを 見つける場合は非常に効率的ですが、検索条件に該当する件数が多い (全体の10%以上ヒットするとか) 場合は逆に非効率になります。 その辺の所を判断して、オプティマイザが適切 (と思われる) な実行計画を 作成してくれます。