当前位置: 代码迷 >> Oracle开发 >> Oracle中重复率高字段创造B树索引,性能大幅提升的原因
  详细解决方案

Oracle中重复率高字段创造B树索引,性能大幅提升的原因

热度:55   发布时间:2016-04-24 06:40:34.0
Oracle中重复率高字段创建B树索引,性能大幅提升的原因
请教一个让我不解的问题:
我有一张表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树索引为什么可以起到这样的效果?
------解决方案--------------------
本帖最后由 wildwave 于 2014-06-27 16:41:26 编辑
做个试验
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 
------解决方案--------------------
       
------解决方案--------------------
  相关解决方案