oracle IMO史上最详细使用文档

一、IMO介绍
1.1 基本原理
Oracle DB In-Memory是预装在Oracle Database 12c(12.1.0.2之后的版本)中的,不需要安装其他软件或者是重新编译现有的数据库软件。所以如果Oracle Database已经安装,则Oracle DB In-Memory同时也已安装。In-Memory store默认是不开启的,但是可以简单通过几个步骤来开启该功能。

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

下图是IMO特性的原理图,通过在内存中开辟一块独立的区域,Oracle将指定的表或者分区以列式内存存储,但是在存储上,仍然以一份行式存储。新的列式数据是一个纯内存数据,不能在磁盘上持久保存,因此没有任何额外的存储成本或存储同步问题。

Oracle SQL优化器自动将分析查询指向列式,将OLTP查询指向行式,透明的充分发挥两种应用类型的高性能,自动维护行式和列式之间的完全事务一致性。

In-Memory Area是SGA中用列式存储的方式来存储数据的一个静态池。在没有这个特性之前,oracle的数据全部采用行形式进行存储(除EHCC压缩之外),而在In-Memory Area中数据以列式进行存储,通过这种存储方式在某些业务场景中提升扫描性能,如:实时分析、商务智能和报表应用等。

1.2 IMO功能特有后台进程

	IMCO:一个调度进程,负责IM内存数据的加载和重载的计划调度,它不是一直处于工作状态的,每两分钟会触发一次。
	SMCO/Wnnn:该两个后台进程是实际去执行IM对象加载和重载工作的进程,Wnnn可以开启多进程并行工作,由参数INMEMORY_MAX_POPULATE_SERVERS控制,增加其数量可以提供加载效率,但是需要平衡CPU负载,IM对象加载过程是一个非常消耗CPU资源的过程。
	IMCO/SMCO/Wnnn三个进程同时作用,完成IMCU与TX Journal的数据同步,可以保障事务处理过程中的事务一致性。
什么是IMCU(In Memory Compression Units)
	IMCU类似于表空间中extent的概念,是列数据在IM区中内存分配块的大小。后台进程Wnnn在装载数据时,会分配自己的IMCU,并将分配给该进程的数据加载到该IMCU中。
	当访问IM区中的列数据时,我们在统计信息中看到的consistent gets值也就是统计所访问IMCU的个数和所需访问metadata块的个数之和。
	特定对象所分配IMCU的详细信息,可从视图V$IM_HEADER中查询。而其metadata块的信息可从视图V$IM_SMU_CHUNK和V$IM_SMU_HEAD查询。
	在IM内部,以IMCU为单位,Oracle维护了一个In Memory Storage Index,记录IMCU单元中该列的最大值,最小值。
	Oracle也会在metadata区为每个IMCU建立相应的metadata数据字典。metadata信息中有一些列的统计信息。视图V$IM_COL_CU可以帮助查询这些metadata数据字典信息。

1.3 IMO适用场景
(1)需要扫描大量行且通过=、<、>或 IN 谓词条件进行过滤的查询;
(2)在一个具有较多字段的表中,仅查询较少字段,如表中拥有 100 个字段,查询仅获取 5个字段;
(3)小表与大表的连接查询;
(4)聚合数据的查询;

1.4 IMO不适用场景
(1)复杂谓词的查询
(2)查询大量列的查询
(3)查询大量行的查询
(4)多个大表连接的查询

1.5可以启用In-Memory列存储功能的级别
(1)Column
(2)Table
(3)Materialized view
(4)Tablespace
(5)Partition

注:如果在表空间级别上启用该功能,则所有存储在该表空间中的表和物化视图都将继承这一功能。由于内存的资源有效,从节省资源与降低维护成本方面考虑,均不建议将整个表空间进行IMO缓存。
注:SYS用户拥有且存储在SYSTEM或SYSAUX表空间中的对象、IOTs 、Hash clusters、Out of line LOBs 不支持 IMO 特性。

1.6操作选项
可以指定in-memory的操作子句
(1)CREATE TABLE
(2)ALTER TABLE
(3)CREATE TABLESPACE
(4)ALTER TABLESPACE
(5)CREATE MATERIALIZED VIEW
(6)ALTER MATERIALIZED VIEW
例:
ALTER TABLE T1 INMEMORY [PRIORITY p] [MEMCOMPRESS FOR c]
从属子句PRIORITY
CRITICAL、HIGH、MEDIUM:加载至in memory存储的优先级
NONE:不自动填充
从属子句MEMCOMPRESS FOR c
FOR DML
FOR QUERY LOS(默认)
FOR QUERY HIGH
FOR CAPACITY LOW
FOR CAPACITY HIGH
不压缩:NOMEMCOMPRESS

1.7 IMO优先级方式
针对启用了 IMO 的对象,会按照一定的优先级进入 SGA 中配置好的 IN-MEMORY 区域,同时,在 IN-MEMORY 区域用满后,依次置换出优先级较低的对象。下表为关于 IMO 对象优先级说明:
优先级 描述
PRIORITY NONE 缺省级别;执行 SQL 引起对象扫描后,触发进入 IN-MEMORY
PRIORITY CRITICAL 最高优先级;数据库启动后立即进入 IN-MEMORY
PRIORITY HIGH 在具有 CRITICAL 优先级的对象之后进入 IN-MEMORY
PRIORITY MEDIUM 在具有 CRITICAL、HIGH 优先级的对象之后进入 IN-MEMORY
PRIORITY LOW 在具有 CRITICAL、HIGH、MEDIUM 优先级的对象之后进入 IN-MEMORY

1.8 IMO压缩方式
Oracle 在 IMO 中的对象压缩,使用新的压缩算法,只有结果集需要的数据才会进行解压。既考虑节约空间,同时考虑性能的提升。
针对 IMO 对象的压缩可以分为如下 6 种方式,实际压缩比取决于具体数据。
压缩方式 描述
NO MEMCOMPRESS IMO 中数据未压缩
MEMCOMPRESS FOR DML 最小化压缩,优化 DML 操作
MEMCOMPRESS FOR QUERY LOW 缺省方式:查询性能最优(best)、空间压缩效果好于DML 方式
MEMCOMPRESS FOR QUERY HIGH 查询性能次优(excellent)、空间压缩效果好于QUERY LOW,但是比CAPACITY LOW.差
MEMCOMPRESS FOR CAPACITY LOW 查询性能良好(good)、空间压缩效果好于QUERY HIGH,但是比CAPACITY HIGH.差。是CAPACITY 方式的缺省设置。
MEMCOMPRESS FOR CAPACITY HIGH 空间压缩效果最优

二、IMO 环境配置
2.1 IMO初始化参数

SQL> select name,value,description from v$system_parameter where name like '%inmemory%'
NAME                                         VALUE      DESCRIPTION                                                     
-------------------------------------------- ---------- ----------------------------------------------------------------
inmemory_adg_enabled                         TRUE       Enable IMC support on ADG
inmemory_size                                218103808  size in bytes of in-memory area
inmemory_clause_default                                 Default in-memory clause for new tables
inmemory_force                               DEFAULT    Force tables to be in-memory or not
inmemory_query                               ENABLE     Specifies whether in-memory queries are allowed
inmemory_expressions_usage                   ENABLE     Controls which In-Memory Expressions are populated in-memory
inmemory_virtual_columns                     MANUAL     Controls which user-defined virtual columns are stored in-memory
inmemory_max_populate_servers                1          maximum inmemory populate servers
inmemory_trickle_repopulate_servers_percent  1          inmemory trickle repopulate servers percent
optimizer_inmemory_aware                     TRUE       optimizer in-memory columnar awareness

初始化参数 描述
INMEMORY_SIZE 设置数据库实例中IM列存储的大小。缺省值为0,表示IMO 关闭。当INMEMORY_SIZE>0 时,IMO 开启,如果开启 IMO,该参数最小值设置为 100MB。同时该参数允许在 PDB 级别设置,否则将继承 CDB 设置的参数值,在非CDB级别修改INMEMORY_SIZE 参数无需重启实例或PDB
INMEMORY_FORCE 缺省值:DEFAULT,允许数据库INMEMORY 或 NO INMEMORY。 设置为OFF,强制清空 SGA中 IN-MEMORY 内存区域中的对象,即强制关闭 IMO 特性,该参数为动态参数,同时可以在 PDB 级别设置。
INMEMORY_CLAUSE_DEFAULT 缺省值:空,等同于将该参数设为NO INMEMORY。在 IMO 开启的情况下,通过该参数设置新建表或物化视图赋予的 INMEMORY 属性,如:新建表或视图是否直接设置 INMEMORY、INMEMORY 优先级、压缩方法、RAC 环境中是否在所有节点实例中进行 duplicate 保存等。
INMEMORY_QUERY 缺省值:ENABLE,允许在查询时使用IMO;还可以通过在全局或会话级别设置 INMEMORY_QUERY=DISABLE 禁止在查询时考虑使用 IMO 特性,该参数为动态参数,同时可以在 PDB 级别设置。
INMEMORY_MAX_POPULATE_SERVERS 表或物化视图载入内存允许启用的最大发布进程数。该参数缺省值为主机CPU_COUNT的一半。如果INMEMORY_MAX_POPULATE_SERVERS设置为0,则禁用载入。这个参数只能在CDB级别进行调整。
INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT 当 IMCU 中脏数据达到一定阈值时触发 IMCU 向内存重启加载,重新加载过程中可以使用的最大发布进程数,该参数缺省值为 1
OPTIMIZER_INMEMORY_AWARE 用于控制 CBO 优化器是否考虑 IN-MEMORY 特性带来的执行计划改变,该参数默认为 true,在 SQL 执行过程中优化器会考虑 IN-MEMORY 特性。

2.2 IMO启用
在可以为表,表空间或物化视图启用列存储之前,必须为数据库启用列存储。
IMO 的开启与关闭主要通过初始化参数 INMEMORY_SIZE 进行控制,当 INMEMORY_SIZE>0 时,IMO 开启,INMEMORY_SIZE=0 时 IMO 关闭,如果开启 IMO,该参数最小值设置为 100MB。同时该参数允许在 PDB 级别设置,否则将继承 CDB 设置的参数值,在非CDB级别修改INMEMORY_SIZE 参数无需重启实例或PDB。

本测试环境在CDB中设置 INMEMORY_SIZE 为 100M 如下,所有 PDB 将继承该参数值:

SQL> alter system set inmemory_size=100M scope=spfile;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area 1660944384 bytes
Fixed Size                  8793448 bytes
Variable Size            1006633624 bytes
Database Buffers          520093696 bytes
Redo Buffers                7983104 bytes
In-Memory Area            117440512 bytes
Database mounted.
Database opened.

另外,在配置了 IMO 的情况下,也可以通过设置 INMEMORY_FORCE=OFF 的方式强制清空 SGA中 IN-MEMORY 内存区域中的对象,即强制关闭 IMO 特性,该参数为动态参数,同时可以在 PDB 级别设置。
此外,还可以通过在全局或会话级别设置 INMEMORY_QUERY=DISABLE 禁止 CBO 在查询时考虑使用 IMO 特性,该参数为动态参数,同时可以在 PDB 级别设置。

动态增加in-memory size

SQL> alter system set inmemory_size=200M scope=both;
alter system set inmemory_size=200M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-02095: specified initialization parameter cannot be modified

注:增加in-memory size时,至少要比原来大128M,不否则报如上错误

SQL> alter system set inmemory_size=300M scope=both;
System altered.
SQL> show parameter inmemory_size
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
inmemory_size                        big integer 300M

增加inmemory_size时可以动态增加。

静态减少in-memory size(cdb级别)

SQL> alter system set inmemory_size=200M scope=both;
alter system set inmemory_size=200M scope=both
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-02095: specified initialization parameter cannot be modified


SQL> alter system set inmemory_size=200M scope=spfile;
System altered.

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area 1660944384 bytes
Fixed Size                  8793448 bytes
Variable Size            1006633624 bytes
Database Buffers          419430400 bytes
Redo Buffers                7983104 bytes
In-Memory Area            218103808 bytes
Database mounted.
Database opened.
SQL> show parameter inmemory_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------

inmemory_size                        big integer 208M

2.3多租户环境下的IMO
在多租户环境中,可使用的IM列存储大小默认是整个多租户容器数据库(CDB)的设置。 即INMEMORY_SIZE参数的大小和CDB级别设置的一样。 也可以在每个可插拔数据库(PDB)中设置此参数,以限制每个PDB的IM列存储的最大大小。 PDB级别设置的值的总和可以小于,等于或大于CDB级别设置的。 但是,CDB级别设置的值是整个CDB的IM列存储库中可用的最大内存量,包括CDB和所有PDB。 除非该参数是为PDB设定的,否则PDB将继承CDB值,这意味着PDB可以使用CDB的所有可用IM列存储。
在PDB级别修改该参数无需重启实例或者PDB。

SQL> alter system set inmemory_size=300M;
System altered.
SQL> show parameter inmemory_size
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
inmemory_size                        big integer 300M

SQL> alter system set inmemory_size=100M;
System altered.
SQL> show parameter inmemory_size
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
inmemory_size                        big integer 100M

2.4 RAC环境下的IMO
在RAC场景中,每个数据库节点有自己的IM column store,在添加到列内存中时可以使用两个从属子句:DUPLICATE和DISTRIBUTE。

ALTER TABLE T1 INMEMORY PRIORITY NONE MEMCOMPRESS FOR CAPACITY HIGH DISTRIBUTE AUTO NO DUPLICATE;
DISTRIBUTE: 
AUTO
BY ROWED RANGE
BY ROWED PARTITION
SUBPARTITION
DUPLICATE:
 DUPLICATE
NO DUPLICATE
DUPLICATE clause:

一个objects根据DUPLICATE clause的设置将一样的数据加载到多个IM Area中。默认是NO DUPLICATE设置,表示在数据库的IM中对一个objects在所有节点中合起来只保存一份。举例说明,比如三节点的RAC中,对于分区表SALES来讲可能2012年份的数据在1节点,2013年份的数据在2节点,2014年份的数据在3节点,每个分区只保存在一个节点上。为了提升可用性,也可以设置为DUPLICAET ALL,在每个节点上都保存一份。举例说明,还是刚才那个SALES表的情况下,1,2,3三个节点各保存一份完整sales表数据到各自的IM中。在任意一个节点上都可以获取查询需要的数据。
这个参数仅仅在EXADATA环境中有效。在单实例和非EXADATA中这个属性不生效。

DISTRIBUTE clause:
如果一个objects因为太大无法被加载到一个IM Area中,还可以通过DISTRIBUTE clause的设置将它分成几个数据片分别加载到不同的节点中。默认情况下DISTRIBUTE clause的默认值为AUTO-DISTRIBUTE,这时候是否将objects分布式分布在不同的节点上由Oracle内部算法决定。这个参数对于单实例没有影响,在RAC环境中,默认存在IM中的表会分布在各个节点之中。

2.5 DATA PUMP中的IMO
在impdp对象的时候,可以指定如下选项
TRANSFORM=INMEMORY:y 保留导出对象的IM设置
TRANSFORM=INMEMORY:n 不保留导出对象的IM设置
TRANSFORM=INMEMORY_CLAUSE:string 在导入时重新设置导出时的IM设置

三、IMO使用(启用前需收集统计信息,不然用不上IMO)
3.1表级别启用IMO
可以通过如下初始建表或后续修改表 inmemory 属性的方式进行启用

create table t1  ( id number,name varchar2(100), type VARCHAR2(100)) inmemory;
或
alter table t2 inmemory;

SQL> select TABLE_NAME,INMEMORY,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name in('T1','T2');

TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
---------- -------- -------- --------------- -----------------
T2         ENABLED  NONE     AUTO            FOR QUERY LOW
T1         ENABLED  NONE     AUTO            FOR QUERY LOW

看一下未使用In-Memory时的查询

SQL>  set autot trace
SQL> select * from t2;
73187 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1513984157
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 73187 |  9505K|   399   (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T2   | 73187 |  9505K|   399   (1)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
         66  recursive calls
          5  db block gets
       6302  consistent gets
          0  physical reads
          0  redo size
   11171258  bytes sent via SQL*Net to client
      54277  bytes received via SQL*Net from client
       4881  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
      73187  rows processed

执行计划中也可以看到使用TABLE ACCESS FULL扫描,consistent gets也达到了240。

将表放到In-Memory中

SQL> set autot off
SQL> alter table t2 inmemory;
SQL> select TABLE_NAME,INMEMORY,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name ='T2';
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
---------- -------- -------- --------------- -----------------
T2         ENABLED  NONE     AUTO            FOR QUERY LOW

看一下使用In-Memory时的查询

SQL> set autot trace
SQL> select * from t2;
73187 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1513984157
-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      | 73187 |  9505K|    20  (25)| 00:00:01 |
|   1 |  TABLE ACCESS INMEMORY FULL| T2   | 73187 |  9505K|    20  (25)| 00:00:01 |
----------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          3  db block gets
          9  consistent gets
          0  physical reads
          0  redo size
    4924356  bytes sent via SQL*Net to client
      54277  bytes received via SQL*Net from client
       4881  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      73187  rows processed

执行计划中也可以看到使用TABLE ACCESS INMEMORY FULL扫描,consistent gets降到了9,cost从原来的399降到20。

3.2 COLUMN 级启用IMO(表需要先开启IMO,且也需要收集统计信息)
仅启用表中某列前,该表必须先设置为 inmemory 模式,不开启IM column store的列需要加入到NO INMEMORY中,否则这些列默认也会开启INMEMORY。
注:对于列,无法设置单独的优先级,只能对表(物化视图),或者分区表级别

SQL> alter table t1 inmemory (id)no inmemory (NAME,TYPE);

SQL> SELECT table_name, segment_column_id seg_col_id, column_name, inmemory_compression FROM v$im_column_level where table_name in ('T1','T2') ORDER BY 1,3;

TABLE_NAME SEG_COL_ID COLUMN_NAME                    INMEMORY_COMPRESSION
---------- ---------- ------------------------------ --------------------------
T1                  1 ID                             DEFAULT
T1                  2 NAME                           NO INMEMORY
T1                  3 TYPE                           NO INMEMORY

未使用inmemory

SQL> set autot trace
SQL> select id from t1;
Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     3 |    39 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T1   |     3 |    39 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
Statistics
----------------------------------------------------------
         61  recursive calls
          0  db block gets
         57  consistent gets
         10  physical reads
          0  redo size
        598  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
          3  rows processed

使用inmemory

SQL> set autot trace
SQL> select id from t1;
Execution Plan
----------------------------------------------------------
Plan hash value: 3617692013
-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |     3 |    39 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS INMEMORY FULL| T1   |     3 |    39 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------------
Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
Statistics
----------------------------------------------------------
          4  recursive calls
          0  db block gets
          9  consistent gets
          0  physical reads
          0  redo size
        598  bytes sent via SQL*Net to client
        608  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          3  rows processed

3.3物化视图级别启用IMO
物化视图级启用:可以通过如下初始创建物化视图或后续修改物化视图 inmemory 属性的方式进行启用

create materialized view t1_mv inmemory as select * from t1;

alter materialized view t2_mv inmemory;
set linesize 1000
col table_name FORMAT A20 

SELECT table_name,inmemory FROM user_tables where table_name in ('T1_MV','T2_MV');

TABLE_NAME       INMEMORY
-------------------- --------
T2_MV            ENABLED
T1_MV            ENABLED

SQL>select TABLE_NAME,INMEMORY,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name in ('T1_MV','T2_MV');
TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
-------------------- -------- -------- --------------- -----------------
T1_MV                ENABLED  NONE     AUTO            FOR QUERY LOW
T2_MV                ENABLED  NONE     AUTO            FOR QUERY LOW

看一下未使用In-Memory时的查询

SQL> set autot trace
SQL> select * from T2_MV;
2172 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3340348803
------------------------------------------------------------------------------
| Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |       |  2172 |   627K|    30   (0)| 00:00:01 |
|   1 |  MAT_VIEW ACCESS FULL| T2_MV |  2172 |   627K|    30   (0)| 00:00:01 |
------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
         99  recursive calls
          4  db block gets
        289  consistent gets
          0  physical reads
          0  redo size
     724863  bytes sent via SQL*Net to client
       2191  bytes received via SQL*Net from client
        146  SQL*Net roundtrips to/from client
          5  sorts (memory)
          0  sorts (disk)
       2172  rows processed

执行计划中也可以看到使用TABLE ACCESS FULL扫描,consistent gets也达到了289。

将物化视图放到In-Memory中

SQL> set autot off
SQL> alter table t2 inmemory;
SQL> select TABLE_NAME,INMEMORY,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name ='T2';
TABLE_NAME INMEMORY INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
---------- -------- -------- --------------- -----------------
T2         ENABLED  NONE     AUTO            FOR QUERY LOW

看一下使用In-Memory时的查询

SQL>  set autot trace
SQL> select * from t2_mv;
Execution Plan
----------------------------------------------------------
Plan hash value: 3340348803
---------------------------------------------------------------------------------------
| Id  | Operation                     | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |       |  2172 |   627K|     2   (0)| 00:00:01 |
|   1 |  MAT_VIEW ACCESS INMEMORY FULL| T2_MV |  2172 |   627K|     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          3  db block gets
          9  consistent gets
          0  physical reads
          0  redo size
     129301  bytes sent via SQL*Net to client
       2191  bytes received via SQL*Net from client
        146  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
       2172  rows processed

执行计划中也可以看到使用TABLE ACCESS INMEMORY FULL扫描,consistent gets降到了9,cost从原来的30降到2。

3.4表空间级启用
可以通过如下初始创建表空间或后续修改表空间 inmemory 属性的方式进行启用,在属性为 inmemory 的表空间中创建的对象自动加载 inmemory 属性,除非显示设置对象为 no inmemory

create tablespace test datafile '+DATA/cdb/test01.dbf' size 100M default inmemory;

alter tablespace test default inmemory;
select tablespace_name, def_inmemory from dba_tablespaces where tablespace_name in ('TEST');
TABLESPACE_NAME                 DEF_INMEMORY
------------------------------ ---------------
TEST                            ENABLED

在新建立的表空间上建立一张表,且表不指定INMEMORY

SQL> create table c##test.t3 tablespace test as select * from dba_objects;
Table created.

可以看到新建立的表也都开启了INMEMORY,这是因为在表空间级别开启了INMEMORY

SQL> select TABLE_NAME,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name='T3' and owner='C##TEST';
TABLE_NAME           INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
-------------------- -------- --------------- -----------------
T3                   NONE     AUTO            FOR QUERY LOW

使用In-Memory时的查询

SQL> set autot trace
SQL> select * from t3;
Execution Plan
----------------------------------------------------------
Plan hash value: 4161002650
-----------------------------------------------------------------------------------
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      | 73071 |  9490K|    20  (25)| 00:00:01 |
|   1 |  TABLE ACCESS INMEMORY FULL| T3   | 73071 |  9490K|    20  (25)| 00:00:01 |
-----------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          3  db block gets
          9  consistent gets
          0  physical reads
          0  redo size
    4898924  bytes sent via SQL*Net to client
      54188  bytes received via SQL*Net from client
       4873  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      73071  rows processed

设置表为no inmemory

SQL> ALTER TABLE t3 no inmemory;
SQL> select TABLE_NAME,INMEMORY_PRIORITY,INMEMORY_DISTRIBUTE,INMEMORY_COMPRESSION from dba_tables where table_name='T3' and owner='C##TEST';

TABLE_NAME           INMEMORY INMEMORY_DISTRI INMEMORY_COMPRESS
-------------------- -------- --------------- -----------------
T3
SQL> set autot trace
SQL> select * from t3;
Execution Plan
----------------------------------------------------------
Plan hash value: 4161002650
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 73071 |  9490K|   398   (1)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T3   | 73071 |  9490K|   398   (1)| 00:00:01 |
--------------------------------------------------------------------------
Statistics
----------------------------------------------------------
          0  recursive calls
          5  db block gets
       6216  consistent gets
          0  physical reads
          0  redo size
   11142585  bytes sent via SQL*Net to client
      54188  bytes received via SQL*Net from client
       4873  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      73071  rows processed

对比执行计划中也可以看到使用TABLE ACCESS INMEMORY FULL扫描,consistent gets从6216降到了9,cost从原来的398降到20。

3.5分区表分区级启用
可以通过如下初始创建分区表或后续修改分区 inmemory 属性的方式进行启用

CREATE TABLE t5_part (
    id number NOT NULL,
    iddate DATE,
    scn number
    ) tablespace users PARTITION BY range (id) (
    PARTITION p_test_1 VALUES less than(20000) inmemory,
    PARTITION p_test_2 VALUES less than(40000),
    PARTITION p_test_3 VALUES less than(60000),
    PARTITION p_test_4 VALUES less than(maxvalue)
    );

alter table t5_part modify partition P_TEST_1 inmemory;
SELECT table_name,
    partition_name,
    inmemory
FROM user_tab_partitions
WHERE table_name ='T5_PART'
ORDER BY 2;
TABLE_NAME                    PARTITION_NAME    INMEMORY    
-------------------- -------------------- --------    
T5_PART                    P_TEST_1    ENABLED    
T5_PART                    P_TEST_2    DISABLED    
T5_PART                    P_TEST_3    DISABLED    
T5_PART                    P_TEST_4    DISABLED    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值