Skip to main content
  • Place orders quickly and easily
  • View orders and track your shipping status
  • Enjoy members-only rewards and discounts
  • Create and access a list of your products

如何配置 Oracle database 12c In-memory 选项

Summary: 我们的目标是提供各种解决方案,通过提供数据库解决方案、自定义开发、动态数据中心、灵活计算,从而简化IT

This article applies to This article does not apply to This article is not tied to any specific product. Not all product versions are identified in this article.

Symptoms

适用对象: 
Oracle 数据库 – 12.1.0.2

作者:

Mahesh Reddy M

简介:

随着 Oracle Database 12c In-Memory 的引入,单个数据库现在可以高效地支持混合工作负载,既为事务提供最佳性能,又同时支持实时分析和报告。In-Memory 使数据集市和数据仓库均可提供更多的临时分析,从而使最终用户现在能够同时运行多个业务驱动查询,并且只需花费以前运行一个查询的时长。使用此功能,您可以采用纵列格式(而不是典型的行格式)将列、表、分区和实例化视图存储在内存中。In-Memory 列存储(IM 列存储)是 12.1.0.2 修补程序集的标题功能。

Oracle Database 12c In-Memory 架构:

传统上,数据仅以行格式存储,然而,In-Memory 数据库仅采用纵列格式存储数据。因此,oracle database 12c 支持双格式架构。
  1. 只要请求数据进行读/写操作(数据操作),它们就会被加载到传统行存储区(缓冲区缓存)
  2. 只要为只读操作请求数据,它们就被会填充到新的 In-Memory 列存储中。当然,此填充包括从行到纵列格式的转换。
  3. 每当提交包括插入、更新或删除的事务时,新数据将立即同时显示在行存储和 in-memory 列存储中。因此,两个存储在事务上是一致的
In-Memory 列存储:

Database In-Memory 使用 In-Memory 列存储,这是被称为 In-Memory Area 的 System Global Area (SGA) 的新组件。IM 列存储中的数据不会以传统行格式保存,而是使用新的列格式。IM 列存储不会替换缓冲区缓存,而是充当补充,因此现在可以用行和列格式将数据存储在内存中

In-Memory area 是 SGA 内的静态池,其大小由初始化参数 INMEMORY_SIZE(默认值为 0)控制。In-Memory area 的当前大小在 V$SGA 中可见

IM 列存储被进一步划分为两个池:
  1. 1 MB 池 — 存储实际的列格式化数据
  2. 64k 池 — 存储对象的元数据。
通过下面的查询,我们可以查看每个池中可用的内存量

SQL> select * from v$inmemory_area;
 
POOL  ALLOC_BYTES USED_BYTES POPULATE_STATUS CON_I
1MB POOL 2.5767E+11 2.3569E+11 完成 1
64KB POOL 6.4408E+10  876347392 完成 1
1MB POOL 2.5767E+11 2.3569E+11 完成 2
64KB POOL  6.4408E+10 876347392 完成 2
1MB POOL 2.5767E+11 2.3569E+11 完成 3
64KB POOL 6.4408E+10 876347392 完成 3
表 1: 每个池中的可用内存

启用 IM 列存储:

作为静态池,在重新启动数据库实例之前,对 INMEMORY_SIZE 参数所做的任何更改都不会生效。它也不会受到自动内存管理 (AMM) 的影响或控制。In-Memory area 的最小大小必须为 100MB。

sql> ALTER SYSTEM SET SGA_TARGET=500G SCOPE=SPFILE;
sql> ALTER SYSTEM SET INMEMORY_SIZE=300G SCOPE=SPFILE;
sql>SHUTDOWN IMMEDIATE;
sql>STARTUP;

ORACLE 实例开始。

总 System Global Area:4.2950E+11 个字节
固定大小:7677400 个字节
可变大小:2.0938E+10 个字节
数据库缓冲区:8.5899 E + 10 个字节
重做缓冲区:529190912 个字节
In-Memory Area:3.2212 E + 11 个字节
数据库已装载。
数据库已打开。

可使用下面的查询查看 In-Memory 设置

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                          biginteger    300G
inmemory_trickle_repopulate_servers_   integer       1
百分数
optimizer_inmemory_aware               boolean      TRUE

我们还可以在 CDB 和 PDB 级别设置 inmemory_size 参数。如果您在 PDB 级别设置此参数,则无需重新启动实例或 PDB。所有 PDB 值的总和小于或等于 CDB 值。

我们可以在下面所示的 PDB 级别启用和禁用 In-Memory 选项

连接到 PDB,然后执行下面的命令

禁用:

Alter system set inmemory_size=0; 或

Alter system reset inmemory_size;

启用:

Alter system set inmemory_size=20G;

In-Memory 优先级级别:

IM 列存储应被填充数据库中的性能关键性最高的数据。性能关键性较低的数据可能驻留在较低成本的闪存或磁盘上。当然,如果您的数据库足够小,则可以将所有表填充到 IM 列库中。Database In-Memory 为表和实例化视图添加新的 INMEMORY 属性。

我们可以在

表空间、表、(子)分区和实例化视图中启用 INMEMORY 属性。

如果在表空间级别启用此属性,则默认情况下将为 IMCOLUMN 存储启用表空间中的所有表和实例化视图。

alter tablespace quest INMEMORY;

如果在表级别启用此属性,则应将表的所有列都填充到 IMCOLUMN 存储中。但是,您可以将列的子集仅填充到 IMCOLUMN 存储中。

Alter table quest_tab INMEMORY NO Inmemory (EMP);

同样,对于分区表

Alter table quest_tab INMEMORY MODIFY Partition  quest_part_1 No Inmemory;

后台进程:

IMCO:IMCO 后台进程会启动已启用 in-memory 且优先级为 LOW/MEDIUM/HIGH/CRITICAL 的对象的填充(预填充)。

SMCO:SMCO 动态地产生从属进程 (Wnnn) 以实施这些任务。

Wnnn:Wnnn 进程执行 in-memory 填充和 in-memory 重新填充任务,以填充或重新填充已启用 in-memory 的对象。

对象在数据库打开后立即被填充到 IM 列存储的优先化列表中,或者在首次扫描(查询)后被填充到 IM 列存储中。填充对象的顺序由关键字 PRIORITY 控制,分为五个级别。默认 PRIORITY 为 NONE,这意味着仅在第一次扫描对象后才填充对象

由 INMEMORY 分句的 PRIORITY 子句控制的不同优先级级别
优先级级别    说明

CRITICAL        数据库打开后立即填充对象

HIGH                填充所有 CRITICAL 对象后填充此对象                                             

MEDIUM          在填充所有 CRITICAL 和 HIGH 对象后填充中此对象

LOW                 填充所有 CRITICAL、HIGH 和 MEDIUM 对象后填充此对象

NONE              只有在第一次扫描后时才会填充任何此对象(默认值)

 小于 64KB 的对象不会填充到内存中,因为内存在 1MB 区块中分配致使这些对象在 IM 列存储中浪费大量空间。

例如:alter table quest inmemory priority critical;

In-Memory 压缩技术:

IM 列存储使用为访问速度而优化的特殊压缩格式,而不是存储缩减。数据库通过以下方式提升速度:
  • 压缩格式使数据库可以减少为每列处理的内存量。SQL 直接在压缩列上执行。
  • 数据库使用 SIMD 矢量(阵列)指令在单 CPU 时钟周期内处理列值阵列。数据库可将多个值存储在一个矢量中,从而通过 SIMD 矢量处理最大限度地提高性能优势。
In-memory 的压缩是使用关键字 MEMCOMPRESS(INMEMORY 属性的子句)指定。有六个级别,每个级别都提供不同级别的压缩和性能。

No Memcompress:数据填充至 In-Memory,无压缩。

Memcompress for DML:它主要用于 DML 性能和最少的压缩。

Memcompress for Query Low:针对查询性能进行了优化(默认值)。

Memcompress for Query High:针对查询性能和节省空间进行了优化

Memcompress for Capacity Low:与查询“高和低”相比,节省更多空间

Memcompress for Capacity High:针对空间节省进行了优化,并且性能稍低。

压缩率可能会从 2-20 倍不等,具体取决于所选的压缩选项、数据类型和表中的内容。

例如:alter table quest inmemory memcompress for query high;

RAC 上的 In-Memory 列存储:

在群集环境中,每个节点都有自己的列存储。群集中的每个节点都应保持与 IM 列存储相同的大小。默认情况下,填充到内存中的所有对象都将分布在群集中的所有 IM 列存储中。“INMEMORY”属性的两个附加子句(DISTRIBUTE 和 DUPLICATE)(仅限 Enineered 系统)控制对象在群集中 IM 列存储中的分布。

分布:

在群集中分布的对象通过分布子句进行控制。您可以按以下方式分布对象

按行范围分布 — 将对象按行分布到不同节点

按分区分布 — 将分区分布到群集中的节点

按子分区分布 — 将子分区分布到不同的节点。

例如:alter table quest inmemory distribute by partition;

在这里,需要重点指出的是,Oracle In-Memory RAC 是查询的 shared-nothing 架构,即,如果您对内存内数据对象发出查询(假设对象在两个 IM 列存储中分布),只能访问仿射节点中的数据,这意味着不会在群集中的所有实例之间共享 IMCU(Inmemory 压缩单元)。

因此,您可以将并行度 (DOP) 设置为 AUTO。并行查询协调器识别 IMCU 位置的其他实例。如果您无法将 DOP 设置为 AUTO,则并行查询协调器不会使用 IMCU 的其他实例。

将并行度设置为 auto

alter system set parallel_degree_policy=AUTO scope=both sid='*';

复制:

为了提高可用性,对象被复制到所有实例中。您可以使用重复的子句来指定 inmemory 表存储在群集中的所有实例中。对于未设计的系统,此选项将不起作用。

例如:alter table quest inmemory duplicate all;

       查询表存储在所有实例中。

监视内存中对象:

为监控内存中对象,oracle 引入了两个新的 V$ 视图

v$IM_SEGMENTS 或  v$IM_USER_SEGMENTS 和 v$IM_COLUMN_LEVEL。

通过这些视图,我们可以了解当前填充到 IMCOLUMN 存储中的对象数。

例如:

set linesize 256

set pagesize 999

select segment_name,ROUND(SUM(BYTES)/1024/1024/1024,2) "DATA GB",

ROUND(SUM(INMEMORY_SIZE)/1024/1024/1024,2) "IN-MEM GB",

ROUND(SUM(BYTES-BYTES_NOT_POPULATED)*100/SUM(BYTES),2) "% IN_MEM",

ROUND(SUM(BYTES-BYTES_NOT_POPULATED)/SUM(INMEMORY_SIZE),2) "COMP RATIO"

from V$IM_SEGMENTS

group by owner,segment_name

order by SUM(bytes) desc;

SEGMENT_NAME              ORIG GB     IN-MEM GB   % IN_MEM    COMP RATIO

H_LINEITEM                         317.27          68.2                88.77           4.13

H_PARTSUPP                         35.17        21.04                100             1.67

例如:

set linesize 256

set pagesize 999

set verify off

col OBJECT format a30

SELECT owner||'.'||table_name OBJECT,

inmemory INMEMORY,inmemory_priority PRIORITY,

inmemory_distribute DISTRIBUTE,inmemory_compression COMPRESSION,

inmemory_duplicate DUPLICATE

FROM all_tables

where owner='QUEST'

ORDER BY inmemory, owner||'.'||table_name;

OBJECT               INMEMORY   PRIORITY   DISTRIBUTE   COMPRESSION              DUPLICATE

H_NATION         ENABLED      CRITICAL          AUTO           FOR QUERY HIGH            NO DUPLICATE

H_REGION         ENABLED     CRITICAL          AUTO           FOR QUERY HIGH            NO DUPLICATE

H_CUSTOMER

H_SUPPLIER

  在上面的示例中,您将看到两个表 — Customer 和 Supplier — 没有“INMEMORY”列的值。INMEMORY 属性是段级别属性。Customer 和 Supplier 均为分区表,因此是逻辑对象。这些表的 INMEMORY 属性将在 *_TAB_ (SUB) PARTITIONS 中的分区或子分区级别记录。

另外三列— INMEMORY_PRIORITY、INMEMORY_DISTRIBUTE 和 INMEMORY_COMPRESSION — 还被添加到 * _TABLES 视图中,以指示每个表的当前 InMemory 属性。
Article Properties
Article Number: 000124827
Article Type: Solution
Last Modified: 21 Feb 2021
Version:  3
Find answers to your questions from other Dell users
Support Services
Check if your device is covered by Support Services.