- PR -

Oracleの複合索引に関して

1
投稿者投稿内容
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2006-03-19 00:03
現状実機によるテストができないため、
ご存知の方いらしたら教えていただけないでしょうか。

Oracleの複合索引に関して教えていただきたいのですが、
今まで、WHERE句で指定するフィールドに対して、のみIndexを張ればよいと思っていましたが、以下のURLにはSELECT句でも使用する列を含めて、
Indexを張ることでパフォーマンスをあげています。

通常Indexを張る場合はSELECT句でも使用するフィールドを含めて、
Indexを張った方が良いのでしょうか?

 例えば、SELECT * をよく使うテーブルに対しては全フィールドに対して張る?



URLの図4辺り
http://www.atmarkit.co.jp/fdb/rensai/orasql08/orasql08_1.html
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-03-19 01:05
こんばんは

これは実際の環境でテストしてみないとなんともいえないと思います。
インデックスファイルが増えればそれだけオープンするファイルも増えるわけで通常は遅くなります。
更新が頻繁にかかるテーブルなんかだったら悲惨なことになりそうですが...
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2006-03-19 18:02
お返事有難うございます。

やはり実機で確認しないとわからない ということでしょうか?

また、SELECT句でも使用する列を含めて、
Indexを張ることでパフォーマンスをあげることができるというのは
まぎれもない事実なんですね。。。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-03-19 19:40
こんばんは

引用:

パフォーマンスをあげることができるというのは
まぎれもない事実なんですね。。。


この辺りはちょっと疑問です、必ずしもあがるわけではないと思います。

select column1 from 〜 where column1 = 〜
であれば、インデックスファイルを参照するだけで存在するデータがわかるので
それをそのまま取得データとして適用出来ると思いますが

select column1,column2,... from 〜 where column1 = 〜
な感じだと column1,column2,...それぞれのインデックスファイルを開きそのインデックスが指しているレコードの関係を解決したりする手順になると思いますが、
インデックスが多すぎるとインデックスファイルをオープンするオーバーヘッドで
逆に遅くなるのではないでしょうか?リソースも無駄遣いになる気もしますが...

昔のことで申し訳ないんですけど、100レコード程度のデータの場合インデックスをまったく貼らないほうが速いということもありました。

なので実際の環境に近い状態でテストしてみないとなんともいえないと思います。
それかOracleのなかのひとに聞いてみないと...w
もしもし
ぬし
会議室デビュー日: 2004/10/15
投稿数: 280
投稿日時: 2006-03-20 10:29
引用:

Kiraさんの書き込み (2006-03-19 18:02) より:
Indexを張ることでパフォーマンスをあげることができるというのは
まぎれもない事実なんですね。。。



索引を使ってもパフォーマンスがダウンすることは十分あり得ます。
検索対象のデータが全ブロックに分散していたら、索引スキャンした上に
全ブロックスキャンが実行されますし。つまり、単なる full table
スキャン一発の方がよっぽど速く処理できます。

CBO なら(で、ヒストグラムも取得していたら)この辺りは適切な
実行計画を判断してくれますが、RBO だったら(というか統計を
取っていなかったら)SQL の構文通り索引を参照してブロックも参照して、
パフォーマンスががた落ちになることもあるでしょう。

_________________
もしもし@RMAN 友の会
まいるどきゃっと
大ベテラン
会議室デビュー日: 2004/08/12
投稿数: 135
お住まい・勤務地: 群馬
投稿日時: 2006-03-20 12:21
あの記事はあくまでテクニックの一つとして紹介しているだけなので、常にSELECT句で使用するフィールドもインデックスに含めたほうがいいという話ではありません。

どうしてもパフォーマンスを上げたいけど、他の方法では困難な場合に検討してみてはどうですか?くらいに思っておいたほうが吉かと。
takepon
ベテラン
会議室デビュー日: 2005/11/28
投稿数: 55
お住まい・勤務地: 千葉県・東京都
投稿日時: 2006-03-20 12:38
引用:

Oracleの複合索引に関して教えていただきたいのですが、
今まで、WHERE句で指定するフィールドに対して、のみIndexを張ればよいと思っていましたが、以下のURLにはSELECT句でも使用する列を含めて、
Indexを張ることでパフォーマンスをあげています。

通常Indexを張る場合はSELECT句でも使用するフィールドを含めて、
Indexを張った方が良いのでしょうか?

 例えば、SELECT * をよく使うテーブルに対しては全フィールドに対して張る?


URLの図4辺り
http://www.atmarkit.co.jp/fdb/rensai/orasql08/orasql08_1.html



いまこの記事を拝見しました。
この記事はあくまでパフォーマンスをあげる手段の一つとして複合索引を貼るとよいケースがある、と紹介しているのであって、
実際の実行計画まで明示し、なぜ速くなるのかを解説してくださっています。

なので、kiraさんも実行計画を確認して判断するのが一番かと思います。

引用:

また、SELECT句でも使用する列を含めて、
Indexを張ることでパフォーマンスをあげることができるというのは
まぎれもない事実なんですね。。。



この記事では「まぎれもない事実」として書いているのではありません。
せめて実機でなくとも、開発環境や検証環境で実行計画を取るくらいのことはやるべきだとおもいます。
_________________
takepon
てんてこダンス
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2006-03-23 23:06
皆様、ご意見有難うございました。
takeponさんのおっしゃるとおり、テスト環境なり、作ってみるところから
はじめたいと思います。
1

スキルアップ/キャリアアップ(JOB@IT)