索引显然不会被选择用于组

时间:2015-07-08 15:14:47

标签: oracle oracle11g

我有这张桌子:

code|c1|c2|ins_date

这个指数

ins_date asc, code

我的查询是:

select code, count(*), to_date('24-06-2015','dd-mm-yyyy') from T1 
        where ins_date=to_date('24-06-2015','dd-mm-yyyy') 
         group by code;

这个查询非常慢,因为有数百万条记录。 无论如何,根据执行计划判断:

|   0 | SELECT STATEMENT   |        |     4 |    48 |    11  (10)| 00:00:01|
|   1 |  HASH GROUP BY     |        |     4 |    48 |    11  (10)| 00:00:01 |
|*  2 |   TABLE ACCESS FULL| T1     |  1390 | 16680 |    10   (0)| 00:00:01 |

似乎我没有使用ins_date上的索引,但是已经完成了整个表的访问! 这是为什么?通过声明删除该组:

select count(*), to_date('24-06-2015','dd-mm-yyyy') from T1 
        where ins_date=to_date('24-06-2015','dd-mm-yyyy');

我反而得到:

|*  2 |   INDEX FAST FULL SCAN| T1_INSD |  1390 | 11120 |     3   (0)| 00:00:01 |

1 个答案:

答案 0 :(得分:1)

Oracle的印象(基于您的表统计信息)如下:

1)有1390条记录,其中ins_date = to_date('24 -06-2015','dd-mm-yyyy')和

2)使用FULL SCAN读取表格需要10(aprox。阻止I / O)

|*  2 |   TABLE ACCESS FULL| T1     |  1390 | 16680 |    10   (0)| 00:00:01 |
                                       ^^^^^             ^^

我只能推测,但非常可能的情况如下:

1)你用1390条记录填充了表格,每条记录都有ins_date = to_date('24 -06-2015','dd-mm-yyyy')

2)您(或Oracle)收集了表统计信息

3)你添加了“数百万或记录”

这完全符合您的执行计划。请注意,在步骤3)之前,显示的执行计划是正确的并且表现最佳!

补救措施很简单 - 重新收集表统计信息并重复查询。