请教一个让我不解的问题:
我有一张表TT,数据大概是240W,其中的一个字段COL1的值只有‘0’和‘1’两个。现在有如下查询:SELECT COL2,SUM(NVL(COL3,0) * nvl(COL4,0))
FROM TT
WHERE COL1 = '0'
GROUP BY COL2;
在查询耗时大概是 50s。
为了提高性能,在TT表的COL1字段上创建了位图索引,查询耗时变为 2s
但是由于我需要对TT表做大量的Insert和Update操作,位图索引锁表的风险很大,所以只能放弃使用。
因为TT表的数据量还在增大,我们的DBA建议我把这个表修改为分区表,但是,我自己又不想动生产的数据库。所以在COL1上建了一个普通B树索引试了下,发现性能大幅提升,耗时也是2s左右,B树索引起了很大作用。
在我的概念里,重复率高的字段是肯定不适合建B树索引的,强制使用B树索引反而会因为增加索引开销,比全表扫描还要慢些。所以请教各位高手,在COL1字段上建B树索引为什么可以起到这样的效果?
------解决方案--------------------
做个试验
SQL> create table test11 as select rownum id,1 flag from dual connect by rownum<1000000;
Table created
SQL> update test11 set flag=0 where rownum<10000;
9999 rows updated
SQL> commit;
Commit complete
SQL> create index test11_flag on test11(flag);
Index created
上面创建了一个表,flag字段只有两个值,0和1,但为0的数量占总数的1/100;
在flag字段上建索引
看下面两个语句的执行计划
SQL> set autot on
SQL> select avg(id) from test11 where flag=0;
AVG(ID)
----------
5000
Execution Plan
----------------------------------------------------------
Plan hash value: 3570666329
--------------------------------------------------------------------------------
------------
------解决方案--------------------
Id
------解决方案--------------------
Operation
------解决方案--------------------
Name
------解决方案--------------------
Rows
------解决方案--------------------
Bytes
------解决方案--------------------
Cost (%CPU)
------解决方案--------------------
Time
------解决方案--------------------
--------------------------------------------------------------------------------
------------
------解决方案--------------------
0
------解决方案--------------------
SELECT STATEMENT
------解决方案--------------------
------解决方案--------------------
1
------解决方案--------------------
26
------解决方案--------------------
13 (0)
------解决方案--------------------
00:00:01
------解决方案--------------------
------解决方案--------------------
1
------解决方案--------------------
SORT AGGREGATE
------解决方案--------------------
------解决方案--------------------
1
------解决方案--------------------
26
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
2
------解决方案--------------------
TABLE ACCESS BY INDEX ROWID
------解决方案--------------------
TEST11
------解决方案--------------------
2500
------解决方案--------------------
65000
------解决方案--------------------
13 (0)
------解决方案--------------------
00:00:01
------解决方案--------------------
------解决方案--------------------
* 3
------解决方案--------------------
INDEX RANGE SCAN
------解决方案--------------------
TEST11_FLAG
------解决方案--------------------
2500
------解决方案--------------------
------解决方案--------------------