我不得不在当我认为它可能是未使用的索引的查询,所以再现出来的好奇心:为什么这个查询没有使用索引?
创建test_table
与1.000.000行(在col
10倍不同的值,500个字节的数据在some_data
)。
CREATE TABLE test_table AS (
SELECT MOD(ROWNUM,10) col, LPAD('x', 500, 'x') some_data
FROM dual
CONNECT BY ROWNUM <= 1000000
);
创建索引和收集表统计:
CREATE INDEX test_index ON test_table (col);
EXEC dbms_stats.gather_table_stats('MY_SCHEMA', 'TEST_TABLE');
想方设法把col
不同的价值观和COUNT
:
EXPLAIN PLAN FOR
SELECT col, COUNT(*)
FROM test_table
GROUP BY col;
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10 | 30 | 15816 (1)| 00:03:10
| 1 | HASH GROUP BY | | 10 | 30 | 15816 (1)| 00:03:10
| 2 | TABLE ACCESS FULL| TEST_TABLE | 994K| 2914K| 15755 (1)| 00:03:10
---------------------------------------------------------------------------------
不使用索引,提供线索呢不改变这一点。
我猜,索引不能在这种情况下使用,但为什么?
使用该指数将无法防止全面扫描,所以它确实提供了没有任何好处。 – recursive 2010-02-02 16:46:18
@recursive:看起来确实如此,但是为什么在全表扫描中首选的索引不是全面扫描? – 2010-02-02 16:51:02
如果你在这里找不到解决方案,你可以试试asktom.oracle.com(这对我来说非常有帮助)。 – 2010-02-02 17:01:06