Oracle优化

函数索引,仅对部分行建立索引

时间:2013-9-7 19:22:53  作者:solgle.com  来源:说歌社区  查看:254  评论:0
内容摘要:对部分行建立索引背景:如果表中有一列的数据分布很不均匀,大部分是1,少部分是0,而且我们经常查询的刚好是0,在这种情况下,走全表扫描的话,有些浪费资源,如果对该列建立索引的话,那些值为1的索引数据又有些浪费,因为我们很少去查询值为1的数据,所以我们只对值为0的数据建立索引。Sql...
对部分行建立索引
背景:如果表中有一列的数据分布很不均匀,大部分是1,少部分是0,而且我们经常查询的刚好是0,在这种情况下,走全表扫描的话,有些浪费资源,如果对该列建立索引的话,那些值为1的索引数据又有些浪费,因为我们很少去查询值为1的数据,所以我们只对值为0的数据建立索引。
 
Sql代码  
create table t6(status char(1));  
  
begin      
  for i in 1..100000 loop  
    insert into t6 values('1');  
  end loop;  
  for i in 1..10 loop  
    insert into t6 values('0');  
  end loop;  
end;  
 对status列建立索引
Sql代码  
create index idx_t6_status on t6(status);  
 查询索引占用的块
Sql代码  
select index_name, i.leaf_blocks  
  from user_indexes i  
 where index_name = upper('idx_t6_status')  
Sql代码  
INDEX_NAME  LEAF_BLOCKS  
X_T6_STATUS 182  
看到索引叶子块有182个,占用的比较多
 
下面我们只对status='0'建立索引来减少索引叶子块
Sql代码  
drop index idx_t6_status;  
  
create index idx_t6_status on t6(decode(status,'0','0'));  
     INDEX_NAME LEAF_BLOCKS
Sql代码  
1   IDX_T6_STATUS   1  
 可以看到索引叶子块只有1个,数量减少了很多
 
通过索引查询status值为'0'的数据
Sql代码  
select * from t6 where decode(status, '0', '0') = '0'  
 执行计划如下
Sql代码  
SELECT STATEMENT, GOAL = ALL_ROWS           2   29  87  
 TABLE ACCESS BY INDEX ROWID    CARMOT_DEVELOP  T6  2   29  87  
  INDEX RANGE SCAN  CARMOT_DEVELOP  IDX_T6_STATUS   1   389   

 
标签:函数索引 仅对部分行建立索引 

solgle.com 版权所有,欢迎分享!!!

相关文章
    相关评论
       Copyright © 2013-2020 solgle.com,All rights reserved.[solgle.com] 公安机关备案号:51010802000219
    Email:solgle@solgle.com; weixin:cd1008610000 ICP:蜀ICP备14011070号-1