我有一张这样的桌子:
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 列上 - 这使它像闪电一样快速运行!
但是为什么会发生呢?