内存列存储(IM column store) 是Oracle12.1.0.2版本的主要特点。该特点允许列,表,分区和物化视图在内存中以列格式存储,而不是通常的行格式。数据存在内存中的好处显而易见,而列格式存储非常适合商务智能(BI)产品中的分析查询。

列存储是Oracle企业版的独立许可选项。

1.   简介

内存列存储在SGA中是一个新部分,通过初始化参数INMEMORY_SIZE指定大小。可以选择确定的列,整个表,物化视图或表分区组合存储在该部分。或者,你也可以在表空间层启用内存列存储,从而该表空间中的所有表和物化视图自动启用内存列存储。已对下列命令进行了修改以包括另外的in-memory子句。

CREATE TABLE

ALTER TABLE

CREATE TABLESPACE

ALTER TABLESPACE

CREATE MATERIALIZED VIEW

ALTER MATERIALIZED VIEW

常规用例将在后面展示。

文档中说到如下场景适合内存列存储。

  • 使用"=", "<", ">" and "IN"谓词的大数据量扫描。
  • 只返回很多列的表的少数列的查询。
  • 连接小表和大表的查询。
  • 汇聚数据的查询。

文档也提到该特性不适合以下场景。

  • 有复杂谓词的查询。
  • 返回大量列的查询。
  • 返回大量行的查询。
  • 多个大表连接的查询。

从上可知,需记住的最重要的事是要为决定哪些对象将从中受益负责。如果决定正确,你将看到性能的巨大提升。如果决定错误,你将浪费掉本可被缓冲区使用的大量内存。

2.   开启内存列存储

记住,内存列存储是SGA的一部分,因此,SGA必须能包含你指定的NMEMORY_SIZE参数。在多宿主库环境中,如果任何PDB需要存取内存列存储,INMEMORY_SIZE参数必须在CDB中设置。

1)    如果你正使用AMM (MEMORY_TARGET),将必须扩展它以适应INMEMORY_SIZE参数值。

2)    如果你正使用ASMM (SGA_TARGET),将必须扩展它以适应INMEMORY_SIZE参数值。

假定COMPATIBLE参数设置成12.1.0或更高,且SGA总有足够的空间容纳内存列存储,下列过程将开启内存列存储。这里设置INMEMORY_SIZE参数为2G。

ALTER SYSTEM SET SGA_TARGET=3G SCOPE=SPFILE;

ALTER SYSTEM SET INMEMORY_SIZE=2GSCOPE=SPFILE;

SHUTDOWN IMMEDIATE;

STARTUP;

ORACLE instance started.

Total System Global Area 3221225472 bytes

Fixed Size                  2929552 bytes

Variable Size             419433584 bytes

Database Buffers          637534208 bytes

Redo Buffers               13844480 bytes

In-Memory Area           2147483648 bytes

Database mounted.

Database opened.

SQL>

注意,启动期间会显示"In-Memory Area"行。

当前IM相关设置将被如下显示。除了大小,所有其他相关参数均为默认值。

SQL> SHOW PARAMETER INMEMORY

NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

inmemory_clause_default              string

inmemory_force                       string      DEFAULT

inmemory_max_populate_servers        integer     1

inmemory_query                       string      ENABLE

inmemory_size                        big integer 2G

inmemory_trickle_repopulate_servers_integer     1

percent

optimizer_inmemory_aware             boolean     TRUE

SQL>

除非在PDB级别显式设置INMEMORY_SIZE参数,否则,该参数设置将被所有PDB继承。在PDB级别改变INMEMORY_SIZE参数并不要求重启实例或PDB。

CONN sys@pdb1 AS SYSDBA

-- Disable IM column store in the PDB

ALTER SYSTEM SET INMEMORY_SIZE=0;

-- OR

ALTER SYSTEM RESET INMEMORY_SIZE;

-- Assign a PDB-specific size.

ALTER SYSTEM SET INMEMORY_SIZE=1G;

3.   关闭内存列

根据你的目的,有多种关闭内存列存储的方法。

设置INMEMORY_FORCE参数为"OFF"意味着对象不再被保存在内存列存储中,将其切换回"DEFAULT"将恢复其默认的行为。

-- System level

ALTER SYSTEM SET INMEMORY_FORCE=OFF;

ALTER SYSTEM SET INMEMORY_FORCE=DEFAULT;

设置INMEMORY_QUERY参数为"DISABLE"意味着优化器优化查询时将不再考虑内存列存储。将其切换回"ENABLE"将恢复其默认功能。

-- System level

ALTER SYSTEM SET INMEMORY_QUERY=DISABLE;

ALTER SYSTEM SET INMEMORY_QUERY=ENABLE;

-- Session level

ALTER SESSION SET INMEMORY_QUERY=DISABLE;

ALTER SESSION SET INMEMORY_QUERY=ENABLE;

为了完全禁用内存列存储且释放内存,只需重置INMEMORY_SIZE参数。

ALTER SYSTEM RESET INMEMORY_SIZESCOPE=SPFILE;

SHUTDOWN IMMEDIATE;

STARTUP;

就像前面说的,可以更改PDB级别的设置且不需要实例或PDB重启。

4.   管理表

CREATE TABLE和ALTER TABLE命令已被改进,因此,你可以决定表是否要存储在内存列存储中。以NO INMEMORY子句创建的表和不确定子句是一样的。下面的例子将展示用三种语法创建的三个表。

视图[DBA|ALL|USER]_TABLES已经被改进来包含内存列存储相关的信息。

CONN test/test@pdb1

CREATE TABLE im_tab (

id  NUMBER

) INMEMORY;

CREATE TABLE noim_tab (

id  NUMBER

) NO INMEMORY;

CREATE TABLE default_tab (

id  NUMBER

);

COLUMN table_name FORMAT A20

SELECT table_name,

inmemory,

inmemory_priority,

inmemory_distribute,

inmemory_compression,

inmemory_duplicate

FROM  user_tables

ORDER BY table_name;

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

-------------------- -------- ----------------------- ----------------- -------------

DEFAULT_TAB          DISABLED

IM_TAB               ENABLED  NONE    AUTO            FOR QUERY LOW     NO DUPLICATE

NOIM_TAB             DISABLED

3 rows selected.

SQL>

ALTER TABLE命令可以改变对象内存列存储方面的状态。下例容易的改变内存列存储的状态。

ALTER TABLE IM_TAB NO INMEMORY;

ALTER TABLE NOIM_TAB INMEMORY MEMCOMPRESS FORCAPACITY LOW;

ALTER TABLE DEFAULT_TAB INMEMORY PRIORITYHIGH;

SELECT table_name,

inmemory,

inmemory_priority,

inmemory_distribute,

inmemory_compression,

inmemory_duplicate

FROM  user_tables

ORDER BY table_name;

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

-------------------- -------- -------- -------------------------------- -------------

DEFAULT_TAB          ENABLED  HIGH    AUTO            FOR QUERY LOW     NO DUPLICATE

IM_TAB               DISABLED

NOIM_TAB             ENABLED  NONE    AUTO            FOR CAPACITY LOW  NO DUPLICATE

3 rows selected.

SQL>

5.   管理列

下例展示将部分列放进内存列存储的语法。

CREATE TABLE im_col_tab (

id   NUMBER,

col1NUMBER,

col2NUMBER,

col3NUMBER,

col4NUMBER

) INMEMORY

INMEMORY MEMCOMPRESS FOR QUERY HIGH (col1,col2)

INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)

NO INMEMORY (id, col4);

通过查询视图V$IM_COLUMN_LEVEL来获取列设置的相关信息。

CONN sys@pdb1 AS SYSDBA

SELECT table_name,

segment_column_id,

column_name,

inmemory_compression

FROM  v$im_column_level

WHERE owner = 'TEST'

and   table_name = 'IM_COL_TAB'

ORDER BY segment_column_id;

TABLE_NAME           SEGMENT_COLUMN_ID COLUMN_NAME                     INMEMORY_COMPRESSION

-------------------- ------------------------------------------------ --------------------------

IM_COL_TAB                           1 ID                              NO INMEMORY

IM_COL_TAB                           2 COL1                            FOR QUERY HIGH

IM_COL_TAB                           3 COL2                            FOR QUERY HIGH

IM_COL_TAB                           4 COL3                            FOR CAPACITY HIGH

IM_COL_TAB                           5 COL4                            NO INMEMORY

5 rows selected.

SQL>

可以用ALTER TABLE命令改变内存列存储的设置。

CONN test/test@pdb1

ALTER TABLE im_col_tab

NO INMEMORY (col1, col2)

INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (col3)

NO INMEMORY (id, col4);

CONN sys@pdb1 AS SYSDBA

SELECT table_name,

segment_column_id,

column_name,

inmemory_compression

FROM  v$im_column_level

WHERE owner = 'TEST'

and   table_name = 'IM_COL_TAB'

ORDER BY segment_column_id;

TABLE_NAME           SEGMENT_COLUMN_ID COLUMN_NAME                     INMEMORY_COMPRESSION

-------------------- ------------------------------------------------ --------------------------

IM_COL_TAB                           1 ID                              NO INMEMORY

IM_COL_TAB                           2 COL1                            NO INMEMORY

IM_COL_TAB                           3 COL2                            NO INMEMORY

IM_COL_TAB                           4 COL3                            FOR CAPACITY HIGH

IM_COL_TAB                           5 COL4                            NO INMEMORY

5 rows selected.

SQL>

6.   管理物化视图

CREATE MATERIALIZED VIEW和ALTER MATERIALIZED VIEW命令和 CREATE TABLE and ALTER TABLE命令类似。

CONN test/test@pdb1

CREATE TABLE t1 AS

SELECT * FROM all_objects;

CREATE MATERIALIZED VIEW t1_mv INMEMORY

ASSELECT * FROM t1;

SELECT table_name,

inmemory,

inmemory_priority,

inmemory_distribute,

inmemory_compression,

inmemory_duplicate

FROM  user_tables

WHERE table_name = 'T1_MV';

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

-------------------- -------- ----------------------- ----------------- -------------

T1_MV                ENABLED  NONE    AUTO            FOR QUERY LOW     NO DUPLICATE

1 row selected.

SQL>

ALTER MATERIALIZED VIEW t1_mv

INMEMORY MEMCOMPRESS FOR CAPACITY HIGH PRIORITY HIGH;

SELECT table_name,

inmemory,

inmemory_priority,

inmemory_distribute,

inmemory_compression,

inmemory_duplicate

FROM  user_tables

WHERE table_name = 'T1_MV';

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

-------------------- -------- ----------------------- ----------------- -------------

T1_MV                ENABLED  HIGH    AUTO            FOR CAPACITY HIGHNO DUPLICATE

1 row selected.

SQL>

ALTER MATERIALIZED VIEW t1_mv NO INMEMORY;

SELECT table_name,

inmemory,

inmemory_priority,

inmemory_distribute,

inmemory_compression,

inmemory_duplicate

FROM  user_tables

WHERE table_name = 'T1_MV';

TABLE_NAME           INMEMORY INMEMORY INMEMORY_DISTRIINMEMORY_COMPRESS INMEMORY_DUPL

-------------------- -------- ----------------------- ----------------- -------------

T1_MV                DISABLED

1 row selected.

SQL>

7.   管理表空间

设置表空间的默认内存列存储参数意味着该表空间内的所有表和物化视图将使用那些设置,显示覆盖情况除外。

下列将展示如何在表空间创建期间设置内存列存储参数。关键字DEFAULT是内存列存储子句的一部分。默认内存列存储设置可以查询DBA_TABLESPACES视图查看。

CONN sys@pdb1 AS SYSDBA

CREATE TABLESPACE new_ts

DATAFILE '/u01/app/oracle/oradata/CDB1/datafile/pdb1/pdb1_new_ts.dbf'SIZE 10M

DEFAULT INMEMORY;

SELECT tablespace_name,

def_inmemory,

def_inmemory_priority,

def_inmemory_distribute,

def_inmemory_compression,

def_inmemory_duplicate

FROM  dba_tablespaces

ORDER BY tablespace_name;

TABLESPACE_NAME                DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_

------------------------------ ---------------- --------------- ----------------- -------------

NEW_TS                         ENABLED  NONE    AUTO            FOR QUERY LOW     NO DUPLICATE

SYSAUX                         DISABLED

SYSTEM                        DISABLED

TEMP                           DISABLED

USERS                          DISABLED

5 rows selected.

SQL>

ALTER TABLESPACE命令用来修改内存列存储参数。

ALTER TABLESPACE new_ts

DEFAULT INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;

SELECT tablespace_name,

def_inmemory,

def_inmemory_priority,

def_inmemory_distribute,

def_inmemory_compression,

def_inmemory_duplicate

FROM  dba_tablespaces

ORDER BY tablespace_name;

TABLESPACE_NAME                DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_

------------------------------ ---------------- --------------- ----------------- -------------

NEW_TS                         ENABLED  NONE    AUTO            FOR CAPACITY HIGHNO DUPLICATE

SYSAUX                         DISABLED

SYSTEM                         DISABLED

TEMP                           DISABLED

USERS                          DISABLED

SQL>

ALTER TABLESPACE new_ts

DEFAULT NO INMEMORY;

SELECT tablespace_name,

def_inmemory,

def_inmemory_priority,

def_inmemory_distribute,

def_inmemory_compression,

def_inmemory_duplicate

FROM  dba_tablespaces

ORDER BY tablespace_name;

TABLESPACE_NAME                DEF_INME DEF_INMEDEF_INMEMORY_DI DEF_INMEMORY_COMP DEF_INMEMORY_

------------------------------ ---------------- --------------- ----------------- -------------

NEW_TS                         DISABLED

SYSAUX                         DISABLED

SYSTEM                         DISABLED

TEMP                           DISABLED

USERS                          DISABLED

5 rows selected.

SQL>

表空间默认设置能被上面展示的对象级的设置覆盖。

8.   视图

我们已看到,有些之前的视图已经被修改以便包括内存列存储信息。下列V$视图已经增加了内存列存储相关的信息。

Oracle12c中性能优化&amp;功能增强新特性之重大突破——内存列存储新特性的更多相关文章

  1. Oracle12c中性能优化&amp;功能增强新特性之临时undo

    临时表最有意思的特点之一是undo段也存储在常规undo表空间中,而它们的undo反过来被redo保护,这会导致一些问题. 1)  写undo表空间需要数据库以读写模式打开,因此,只读数据库和物理备库 ...

  2. Oracle12c中性能优化&amp;功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

    Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1.   设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- ...

  3. Oracle12c(12.1)中性能优化&amp;功能增强之通过参数THREADED_EXECTION使用多线程模型

    1.   后台 UNIX/Linux系统上,oracle用多进程模型.例如:linux上一个常规安装的数据库会有如下进程列: $ ps -ef | grep [o]ra_ oracle  15356  ...

  4. Oracle12c中性能优化增强新特性之数据库智能闪存

    智能闪存功能最初在XD中引入.从Oracle11.2.0.2开始,除了用于XD存储,还可用于任何闪盘.Oracle12c中,不需卷管理器就可以使用闪盘. 1.  简介 智能闪存在solaris和lin ...

  5. Oracle12c中性能优化新特性之新增APPROX_COUNT_DISTINCT 快速唯一值计数函数

    Oracle11g中,为了改善DBMS_STATS包收集统计信息时的唯一值计数功能,增加了 APPROX_COUNT_DISTINCT函数,但文档中未记载.Oracle12c文档中包括了该函数,因此, ...

  6. Oracle12c中SQL优化(SQL TUNING)新特性之SQL计划指令

    SQL计划指令是Oracle12c中自适应查询优化的功能之一.SQL计划指令就像“额外的提醒” ,用以提醒优化器你先前选择了的计划并不是最优的,典型的是因为错误的势评估.错误的势评估往往是由统计信息缺 ...

  7. 【公开课】【阿里在线技术峰会】何登成:AliSQL性能优化与功能突破的演进之路

    MySQL的公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 本文根据阿里高级数据库专家何登成在首届阿里巴巴在线技术峰会上的分享整理而成.他主要介 ...

  8. Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手

    图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...

  9. Java中性能优化的45个细节

    在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时 ...

随机推荐

  1. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  2. Java HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述

    Java HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 一.HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 用Java ...

  3. 20165310_Exp2实验二《Java面向对象程序设计》

    实验二<Java面向对象程序设计> TDD与单元测试 前期准备: 什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.对于单元测试中单元的含 ...

  4. 20145208 蔡野《网络对抗》Exp3 Advanced 恶意代码伪装技术实践

    20145208 蔡野<网络对抗>Exp3 Advanced 恶意代码伪装技术实践 木马化正常软件 思路: 在正常软件包中将原本的程序主文件(平时打开程序用的exe文件)改成dll后缀(或 ...

  5. updateByPrimaryKeySelective更新失败

    问题:使用Mybatis中Mapper内置方法updateByPrimaryKeySelective更新失败. 发现:控制台打印出来的sql语句发现where条件出现所有属性. 解决:映射的实体类没有 ...

  6. Python3基础 type 获得变量的类型

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. 【第三十二章】 elk(3)- broker架构 + 引入logback

    实际中最好用的日志框架是logback,我们现在会直接使用logback通过tcp协议向logstash-shipper输入日志数据.在上一节的基础上修改!!! 一.代码 1.pom.xml 1 &l ...

  8. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

  9. HDU 3046 Pleasant sheep and big wolf(最小割最大流+Dinic)

    http://acm.hdu.edu.cn/showproblem.php?pid=3046 题意: 给出矩阵地图和羊和狼的位置,求至少需要建多少栅栏,使得狼不能到达羊. 思路:狼和羊不能到达,最小割 ...

  10. JS进阶系列之this

    在javascript中,this的指向是在执行上下文的创建阶段确定的,其实只要知道不同执行方式下,this的指向分别是是什么,就能很好的掌握this这个让人摸不透的东西. 一.全局执行 全局执行又分 ...