次のようなテーブルがあります。
myTable (id, group_id, run_date, table2_id, description)
次のようなインデックスもあります。
index myTable_grp_i on myTable (group_id)
私は次のようなクエリを実行していました。
select * from myTable t where t.group_id=3 and t.run_date='20120512';
それはうまくいき、誰もが幸せでした。別のインデックスを追加するまで:
index myTable_tab2_i on myTable (table2_id)
私の人生は惨めになりました...走るのにほぼ5倍の時間がかかります!!! 実行計画は同じように見えます (新しいインデックスの有無にかかわらず):
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 220 | 17019
|* 1 | TABLE ACCESS BY INDEX ROWID| MYTABLE | 1 | 220 | 17019
|* 2 | INDEX RANGE SCAN | MYTABLE_GRP_I | 17056 | | 61
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T"."RUN_DATE"='20120512')
2 - access("T"."GROUP_ID"=3)
頭に髪の毛がほとんど残っていません。使用されていない別のインデックスが、where句に含まれていない列で違いを生むのはなぜですか...
チェックした内容を更新します
。新しいインデックスを削除したところ、動作が速くなりました
b. さらに2つの異なる環境に新しいインデックスを追加しましたが、同じことが起こり
ますc. MYTABLE_GRP_I を run_date 列と group_id 列に変更しました。これにより、電光石火のように高速に実行されました!!
しかし、それでもなぜそれが起こるのでしょうか?