一、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 modifiedSQL> 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_sizeNAME                                 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 300MSQL> 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 calls5  db block gets6302  consistent gets0  physical reads0  redo size11171258  bytes sent via SQL*Net to client54277  bytes received via SQL*Net from client4881  SQL*Net roundtrips to/from client5  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 calls3  db block gets9  consistent gets0  physical reads0  redo size4924356  bytes sent via SQL*Net to client54277  bytes received via SQL*Net from client4881  SQL*Net roundtrips to/from client0  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 calls0  db block gets57  consistent gets10  physical reads0  redo size598  bytes sent via SQL*Net to client608  bytes received via SQL*Net from client2  SQL*Net roundtrips to/from client5  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 calls0  db block gets9  consistent gets0  physical reads0  redo size598  bytes sent via SQL*Net to client608  bytes received via SQL*Net from client2  SQL*Net roundtrips to/from client0  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            ENABLEDSQL>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 calls4  db block gets289  consistent gets0  physical reads0  redo size724863  bytes sent via SQL*Net to client2191  bytes received via SQL*Net from client146  SQL*Net roundtrips to/from client5  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 calls3  db block gets9  consistent gets0  physical reads0  redo size129301  bytes sent via SQL*Net to client2191  bytes received via SQL*Net from client146  SQL*Net roundtrips to/from client0  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 calls3  db block gets9  consistent gets0  physical reads0  redo size4898924  bytes sent via SQL*Net to client54188  bytes received via SQL*Net from client4873  SQL*Net roundtrips to/from client0  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 calls5  db block gets6216  consistent gets0  physical reads0  redo size11142585  bytes sent via SQL*Net to client54188  bytes received via SQL*Net from client4873  SQL*Net roundtrips to/from client2  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

oracle IMO史上最详细使用文档相关推荐

  1. Cobbler无人值守安装系统史上最细实践文档

    本文档来自老男孩教育VIP课程 内部学员总结笔记文档笔记内容,和大家分享! 老男孩教育2016年全干货博客,http://blog.oldboyedu.com Cobbler无人值守安装系统史上最细实 ...

  2. 五分钟轻松搞定产品需求文档!这可能史上最全PRD文档模板…

    本文由  @JustWu 原创发布于社区 为什么写这篇文章? 第一:写PMCAFF的PRD文档,大家都是用户,比较好参考与理解,方便大家来找我写的不好的地方. 第二:我在自学PRD文档的编写过程中,总 ...

  3. 史上最全Apidoc文档生成详解

    api接口文档生成(apidoc基本使用) 基本步骤 1). 安装apidoc (前提:在node环境下) npm i apidoc -g 2). 在项目的根目录配置 创建apidoc.json文件 ...

  4. 自学软件测试怎么学?【史上最详细学习路线】(附全套资料)

    对于想入行学软件测试的新手来说,首先需要一个高效的学习线路图,还要有全套的学习资料,两者结合才能有最好的学习效果. 授人以鱼不如授人以渔,所以今天我也想把我的经验和经历分享给大家,史上最详细的软件测试 ...

  5. GitChat·大数据 | 史上最详细的Hadoop环境搭建

    GitChat 作者:鸣宇淳 原文: 史上最详细的Hadoop环境搭建 关注公众号:GitChat 技术杂谈,一本正经的讲技术 [不要错过文末彩蛋] 前言 Hadoop在大数据技术体系中的地位至关重要 ...

  6. 软件测试自学怎么学?【史上最详细学习路线】(附全套资料)

    对于想入行学软件测试的新手来说,首先需要一个高效的学习线路图,还要有全套的学习资料,两者结合才能有最好的学习效果. 授人以鱼不如授人以渔,所以今天我也想把我的经验和经历分享给大家,史上最详细的软件测试 ...

  7. 史上最详细的LXR安装介绍

    史上最详细的LXR安装介绍(Ubuntu14.04+Apache2.4.7) 简介: LXR (Linux Cross Reference)是一个通过交叉索引方便用户查看项目源代码的工具.项目地址:h ...

  8. 史上最详细sql注入wp

    文章目录 sql注入wp(史上最详细) 前言 什么是SQL注入? SQL注入的原理 常见的注入方式 常见绕过技巧 常见防控SQL注入的方法 手工查询语句 Basic Challenges Less-1 ...

  9. 史上最详细唇语识别数据集综述

    更新:VIPL官网网页格式更改,导致旧的LRW1000链接无法访问,现已更新LRW1000数据集链接,内部包含申请需要的文件 推荐一个大佬的综述,关于实现唇语识别的多种途径. 说明:本文包括经常用语唇 ...

  10. MicroBlaze控制LED入门【史上最详细】

    MicroBlaze控制LED入门[史上最详细] 码字截图不易,转载请注明标题和作者,谢谢!!! 本教程是写给以Xilinx官方开发板作为平台的初学者 本实例中开发环境: 软件平台:Win10专业版 ...

最新文章

  1. 随机洗牌算法 银行家算法
  2. Spring @Resource、@Autowired、@Qualifier区别
  3. IDEA 中 30 秒生成 Spring Cloud Alibaba 工程
  4. spring零碎知识点(二)
  5. CUDA学习(五十一)
  6. WebService C#开发/调用
  7. (pytorch-深度学习)通过时间反向传播
  8. transform: translate()
  9. C++生成指定范围内随机数封装
  10. Spring+IOC(DI)+AOP概念及优缺点
  11. Make my home's PC as proxy server to surf internet
  12. 字符串拼接的双引号和单引号问题,转义字符
  13. [msi]获取msi安装包的ProductCode
  14. 会优化,你真的会优化吗?其实你可能真的缺少一份理解【数据库篇】
  15. linux 永久修改 igmp 版本,Linux环境变量的修改(永久,暂时)
  16. 关于用友华表Cell插件代码
  17. 数据库——数据字典是什么?
  18. gpsgate 配置过程
  19. Python中使用BeautifulReport形成测试报告教程
  20. 【记录】easyexcel导出后打开文件报已损坏

热门文章

  1. hash(哈希)是什么
  2. C语言作业然后是几点,用C语言解“然后是几点”问题
  3. Shiro源码分析(二)——获取Subject
  4. blk_rq_map_user和blk_rq_map_kern
  5. Java开发面试常见问题总结
  6. Visual Studio Ultimate 2013(VS2013旗舰版 下载地址及哈希校验)
  7. 官宣 | 首届云原生编程挑战赛报名通道正式开启
  8. win10误删的注册表能还原吗_win10自带注册表恢复方法 win10注册表误删如何修复...
  9. 算力之都杭州:楼市向何处去
  10. 嵌入式学习——使用STM32F103基于HAL库移植uCOS-III