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了.