【Oracle】ORACLE 12c DB In-Memory简述及启用

    Oracle DB In-Memory是预装在Oracle Database 12c12.1.0.2之后的版本)中的,不需要安装其他软件或者是重新编译现有的的数据库软件。这是因为In-Memory选项是作为SGA的一个新组件无缝集成在Oracle Database软件内核中的,所以如果Oracle Database已经安装,则Oracle DB In-Memory同时也已安装。In-Memory store默认是不开启的,但是可以简单通过几个步骤来开启改功能。

    比较重要的一点是DB In-Memory的开启是在实例级别的,同时对于要存储到In-memoryobjects需要手动指定,否则是不会自动存储到In-Memory Area的。

    In-Memory AreaSGA中用列式存储的方式来存储数据的一个静态池。在没有这个特性之前,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参数控制着在systemsession级别上用户查询是否可以使用列式存储的数据。其他参数也会在之后的文章中一一介绍。

    在当前的参数设置中可以看到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 poolIMCU pool

2.64KB poolSMU 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_BYTES0

你可能感兴趣的