in-memory
Oracle 12c in memory选件通过在SGA中分配独立的内存区域(In Memory Area),对数据使用列式压缩存储来提高查询性能.
In Memory区的大小由参数inmemory_size控制, 是动态参数.
In Memory内存区可分为两个子池,分别为1M pool和64K pool. 1M pool用于存储列式数据. 64K pool用于存储对象的元数据(metadata)和事务日志(transaction journal). 1M pool 中分配的内存块的大小为1M的整数倍,64K pool中分配的内存块大小均为64K。
v$inmemory_area视图有每个pool大小的详细信息:
点击(此处)折叠或打开
SQL> select pool,ALLOC_BYTES/1024 k , used_bytes ,POPULATE_STATUS ,con_id from v$inmemory_area;
POOL K USED_BYTES POPULATE_STATUSCON_ID
---------------------- ---------- ---------- ---------------- ----------
1MB POOL 37711872 0 DONE 3
64KB POOL 8633024 0 DONE 3
Elapsed: 00:00:00.00
SQL> alter table testim inmemory; 当执行设置table为inmemory属性时,并不会在inmemory 内存中分配空间,执行查询加载数据之后才会有。
相对于磁盘或者闪存,内存资源毕竟成本更高,更为有限,所以需要将有限的资源分配给更需要的对象. Oracle新增了一个INMEMORY属性用于控制对象是否会被装载到In Memory区, 该属性可以定义在表 空间,表,分区甚至列级. Oracle In Memory白皮书中给出了一些设置对象IMMEMORY属性的具体用例, 摘录于此, 以备将来参考:
altertablespacetestimdefaultinmemory;
altertabletestinmemorynoinmemory(prod_id);
altertabletestmodifypartitiontest_Q1_1998noinmemory;
altertabletestinmemorymemcompressforquerylow;--默认
此外,为了控制对象的装载顺序,Oracle定义了5种优先级来实现精细控制,通过priority子句来选择.详细信息如下:
1* select SEGMENT_NAME,INMEMORY_SIZE,BYTES,POPULATE_STATUS from v$im_segmentsSEGMENT_NAME INMEMORY_SIZE BYTES POPULATE_STAT
---------------------------------------- ------------- ---------- -------------
TEST 14090240 99426304COMPLETED
TESTIM 4653514752 4.6440E+10 COMPLETED
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。