Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2808872
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Oracle

2015-12-27 22:50:53

                                          Oracle 12c In Memeory新特性 Storage index

   Storage index(下文简称SI),是在exadata平台上的一个特性,通过在内存中维护一块存储区域的最大和最小值.
在扫描时可以下推到cell来执行,从而减少了需要IO的次数,在in memory特性中,每个in memory compress unit也维
护了一个最大值和最小值,这样在在扫描时,可以直接根据最大值和最小值跳过某些不需要的IMCU.

创建一个表,并设置IM属性
SQL> create table t_si inmemory as select 10 id from dual connect by level<1000000;

Table created.

Insert一个和其他的值不一样的数值
SQL> insert into t_si values(11);

1 row created.

SQL> commit;

查看当前的IMCU的状态
SQL> select objd,imcu_addr from v$im_header;

      OBJD IMCU_ADDR
---------- ----------------
     91799 00000000604FFFE8
     91799 0000000061400000


SQL> select objd,head_piece_address,utl_raw.cast_to_number(minimum_value),utl_raw.cast_to_number(t.MAXIMUM_VALUE)
 from v$im_col_cu t
  2  ;

      OBJD HEAD_PIECE_ADDRE UTL_RAW.CAST_TO_NUMBER(MINIMUM_VALUE)
---------- ---------------- -------------------------------------
UTL_RAW.CAST_TO_NUMBER(T.MAXIMUM_VALUE)
---------------------------------------
     91799 00000000604FFFE8           10
         10

     91799 0000000061400000           10
         10

     91799 0000000061500000           11
         11

通过查询v$im_col_cu得到当前有三个IMCU,并且可以看出当前的每个IMCU的最大值和最小值.


比如该查询;
SQL> select count(id) from t_si where id>10;

 COUNT(ID)
----------
  1


................
IM scan CUs pruned                 2
................

由于大于10的IMCU只有1个,因此通过查询v$sesstat可以看到,总共3个IMCU,有2个IMCU被pruned了,
此需扫描1个IMCU即可

再看这个例子

SQL>select count(id) from t_si where id=10

...............
IM scan CUs pruned             ,          1
.................


等于10的IMCU有2个,因此通过查询v$sesstat可以看到,总共3个IMCU,有1个IMCU被pruned了.

阅读(2913) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~