1

次のようなテーブルがあります。

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 列に変更しました。これにより、電光石火のように高速に実行されました!!

しかし、それでもなぜそれが起こるのでしょうか?

4

0 に答える 0