Oracle DB In-Memory是预装在Oracle Database 12c(12.1.0.2之后的版本)中的,不需要安装其他软件或者是重新编译现有的的数据库软件。这是因为In-Memory选项是作为SGA的一个新组件无缝集成在Oracle Database软件内核中的,所以如果Oracle Database已经安装,则Oracle DB In-Memory同时也已安装。In-Memory store默认是不开启的,但是可以简单通过几个步骤来开启改功能。
比较重要的一点是DB In-Memory的开启是在实例级别的,同时对于要存储到In-memory的objects需要手动指定,否则是不会自动存储到In-Memory Area的。
In-Memory Area是SGA中用列式存储的方式来存储数据的一个静态池。在没有这个特性之前,oracle的数据全部采用行形式进行存储(除EHCC压缩之外),而在In-Memory Area中数据以列式进行存储,通过这种存储方式在某些业务场景中提升扫描性能,如:出报表等。
In-Memory Area的大小通过参数INMEMORY_SIZE来进行控制的,改参数默认为0,表示DB In-Memory被禁用。
数据库当前正在使用的INMEMORY_SIZE参数可以通过v$parameter视图进行查看,同时在v$sga视图中也可以看到。In-Memory column存储在一个静态池当中,所以对于INMEMORY_SIZE参数的所有调整都只在该instance重启之后才会生效。同时In-Memory pool的大小也不会受到自动内存管理(AMM)的影响。如果启用DB In-Memory特性,INMEMORY_SIZE最小需要设置为100M。
下面我们来看一下和In-Memory相关的参数:
SQL> show parameter INMEMORY
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_clause_default string
inmemory_force string DEFAULT
inmemory_max_populate_servers integer 0
inmemory_query string ENABLE
inmemory_size big integer 0
inmemory_trickle_repopulate_servers_ integer 1
percent
optimizer_inmemory_aware boolean TRUE
这7个含有INMEMORY前缀的参数分别控制着In-Memory功能的各个方面。比如INMEMORY_QUERY参数控制着在system和session级别上用户查询是否可以使用列式存储的数据。其他参数也会在之后的文章中一一介绍。
在当前的参数设置中可以看到INMEMORY_SIZE参数被设置为0,这代表着DB In-Memory功能未启用,未在SGA中分配相关空间。
我们同样可以通过v$sga进行查看,In-Memory Area没有被分配空间。
SQL> select name,value from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 2929160
Variable Size 469765624
Database Buffers 2600468480
Redo Buffers 13844480
开启DB In-Memory过程如下:
1.修改INMEMORY_SIZE参数:
SQL> ALTER SYSTEM SET INMEMORY_SIZE=1G SCOPE=SPFILE;
System altered.
注意:INMEMORY_SIZE最小为100M。
2.检查sga参数的设置,确保在设置完inmemroy_size参数之后数据库实例还可以正常启动。如果数据库使用了ASMM,则需要检查sga_target参数。如果使用了AMM,则需要检查MEMORY_TARGET参数,同时也需要检查SGA_MAX_TARGET(或MEMORY_MAX_TARGET)。
3.重启数据库实例
SQL> shutdown immediate;
SQL> startup
4.检查重启后的数据库参数设置:
SQL> show parameter INMEMORY_SIZE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
inmemory_size big integer 1G
同时也可通过v$sga视图查询In-Memory Area的分配:
SQL> select name,value from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 2929160
Variable Size 469765624
Database Buffers 1526726656
Redo Buffers 13844480
In-Memory Area 1073741824
在In-Memory Area中又被分为两个小的pool,分别为:
1.1M pool(IMCU pool)
2.64KB pool(SMU pool)
具体分配的大小我们可以通过V$INMEMORY_AREA视图进行查看:
SQL> select pool,alloc_bytes,used_bytes from v$inmemory_area;
POOL ALLOC_BYTES USED_BYTES
-------------------------- ----------- ----------
1MB POOL 854589440 0
64KB POOL 201326592 0
可以看到绝大部分的In-Memory Area被分配为1MB pool。在没有手工指定In-Memory的表时,USED_BYTES为0。