我有这张桌子:
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 |
答案 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)之前,显示的执行计划是正确的并且表现最佳!
补救措施很简单 - 重新收集表统计信息并重复查询。