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