In-Memory手册之:前言(IM-前言)
第一章 Oracle Database In-Memory 相关概念(IM-1.1)
第一章 Oracle Database In-Memory 相关概念(续)(IM-1.2)
第二章 Oracle Database In-Memory 体系结构(上) (IM-2.1)
第二章 In-Memory 体系结构 (IM-2.2)
第二章 IM 体系结构:CPU架构:SIMD向量处理(IM-2.3)
第三章 启用和调整IM列存储的大小(IM-3.1)
第四章 为In-Memory 启用填充对象(IM-4.1 第一部分)
第四章 为In-Memory 启用填充对象(IM-4.2 第二部分)
第四章 为IM 启用填充对象之启用和禁用列(IM-4.3 第三部分)
第四章 为IM 启用填充对象之在NO INMEMORY表上指定INMEMORY列属性:示例(IM-4.4 第四部分)
第四章 为IM 启用填充对象之启用和禁用表空间的IM列存储(IM 4.5)
第四章 为物化视图启用和禁用IM列存储(IM 4.6)
第四章 为IM 启用填充对象之强制填充In-Memory对象:教程(IM 4.7)
本篇为IM系列的第四章:为IM 启用填充对象之为IM列存储启用ADO(IM 4.8)
为IM列存储启用ADO
信息生命周期管理(ILM)是一组用于管理从创建到归档或删除的数据的过程和策略。
自动数据优化(ADO)创建策略,并根据这些策略自动执行操作,以实施ILM策略。 ADO使用热图,并跟踪数据访问模式。
注:
本章假设您熟悉ILM、ADO和Heap Map的基本概念。
此部分包含以下主题:
- 关于ADO策略和IM列存储
在Oracle Database 12c第2版(12.2)中,ADO通过ADO策略管理IM列存储。您只能在段级别创建具有
INMEMORY
子句的ADO策略。 - ADO和IM列存储的目的 从Oracle Database 12c第2版(12.2)开始,ADO将IM列存储管理为新的数据层。
- ADO如何与列数据一起使用 从ADO角度来看,IM列存储是另一个存储层。
- ADO和IM列存储的控制
使用
HEAT_MAP
初始化参数启用热图(Heat Map)。通过SQL和PL / SQL接口控制ADO。 - 为IM列存储创建ADO策略
您可以使用ADO策略根据热图(Heat Map)统计信息设置,修改或删除对象的
INMEMORY
子句。
关于ADO策略和IM列存储
在Oracle Database 12c第2版(12.2)中,ADO通过ADO策略管理IM列存储。您只能在段级别创建具有INMEMORY
子句的ADO策略。
数据库将ADO策略(如对象的属性)视为对象。ADO策略是在数据库级别,而不是实例级别。 Oracle数据库支持以下类型的DatabaseIn-Memory的ADO策略:
· INMEMORY
策略
此策略使用INMEMORY
属性标记对象,启用它们以用于IM列存储中的填充。
· 重新压缩策略
此策略将更改INMEMORY
对象上的压缩级别。
· NO INMEMORY
策略
此策略从IM列存储中删除一个对象,并删除其INMEMORY
对象。
Oracle数据库支持以下条件适用于策略:
· 自对象修改以来的特定天数
从DBA_HEAT_MAP_SEGMENT
视图中的SEGMENT_WRITE_TIME
列获取此值。
· 自访问对象以来的特定天数
此值是DBA_HEAT_MAP_SEGMENT
视图中的列SEGMENT_WRITE_TIME
,FULL_SCAN
和LOOKUP_SCAN
中的较大值。
· 自对象创建以来的特定天数
从DBA_OBJECTS
中的CREATED
列获取此值。
· 用户定义的函数返回布尔值
ADO和IM列存储的目的
从OracleDatabase 12c Release 2(12.2)开始,ADO将IM列存储管理为新的数据层。
您可以创建策略以在IM列存储降低性能时从IM列存储中逐出对象,并在它们提高性能时填充对象。ADO使用HeatMap统计来管理IM列存储。
INMEMORY策略的目的
在许多数据库中,段在创建后经历重大修改。为了最大限度地提高性能,当写活动下降时,ADO可以填充IM列存储中的这些段。例如,如果每天向表中添加分区,则可以创建一个策略,在创建后一天填充sales_2016_d100分区:
代码语言:javascript复制ALTER TABLE sales MODIFY PARTITION sales_2016_d100
代码语言:javascript复制 ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY
代码语言:javascript复制 PRIORITY HIGH
代码语言:javascript复制 AFTER 1 DAYS OF CREATION
同样,您可能知道表上的写入活动在创建后两个月下降,并且希望在满足此时间条件时填充此对象:
代码语言:javascript复制ALTER TABLE 2016_ski_sales
代码语言:javascript复制 ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY
代码语言:javascript复制 PRIORITY CRITICAL
代码语言:javascript复制 AFTER 60 DAYS OF CREATION
上述策略导致2016_ski_sales表的所有现有分区和新分区继承该策略。当段符合策略条件时,数据库将使用指定的INMEMORY
子句独立地标记每个分区。如果段已具有INMEMORY
策略,则数据库将忽略新策略。
重新压缩策略的目的
您可能需要根据访问模式在IM列存储中压缩数据。例如,您可能需要在DML活动停止后2天将段从DML压缩更改为查询压缩:
代码语言:javascript复制ALTER TABLE lineorders
代码语言:javascript复制 ILM ADD POLICY MODIFY INMEMORY MEMCOMPRESS FOR QUERY HIGH
代码语言:javascript复制 AFTER 2 DAYS OF NO MODIFICATION
如果对象未填充在IM列存储中,则此策略仅更改压缩属性。如果对象填充在IM列存储中,则ADO使用新的压缩级别重新填充该对象。如果段尚未具有INMEMORY
属性,则数据库将忽略策略。
NO INMEMORY策略的目的
要优化IM列存储中的空间,您可能需要使用NO INMEMORY
策略驱逐无效段。此策略还有助于防止由不频繁查询导致的非活动分段的数量。例如,如果特定sales分区上的报表在一年中频繁运行,但通常不是每周运行,则您可能希望在一周没有访问后逐出该分区:
ALTER TABLE sales MODIFY PARTITION sales_2015_q1
代码语言:javascript复制 ILM ADD POLICY NO INMEMORY AFTER 7 DAYS OF NO ACCESS;
如果1998年的sales表很少查询,那么你可能想在没有访问的1天后驱逐:
代码语言:javascript复制ALTER TABLE sales_1998
代码语言:javascript复制 ILM ADD POLICY NO INMEMORY AFTER 1 DAYS OF NO ACCESS;
被驱逐的段的查询从不被阻止。数据库可以通过传统的缓冲区缓存机制来访问数据。
ADO如何与列数据一起使用
从ADO角度看,IM列存储是另一个存储层。
此部分包含以下主题:
- Heat Map如何工作 当启用时,Heat Map自动发现数据访问模式。 ADO使用Heat Map数据在数据库级实现用户定义的策略。
- 怎样进行策略评估工作 IM列存储策略的策略评估使用与其他ADO策略的评估相同的基础架构。数据库在维护窗口期间自动评估和执行策略。
Heat Map如何工作
当启用时,HeatMap自动发现数据访问模式。 ADO使用Heat Map数据在数据库级实现用户定义的策略。
Heat Map自动跟踪行和段级别的使用信息。在行级别,Heat Map跟踪数据修改时间,然后将这些时间聚合到块级别。在分段级别,Heat Map跟踪修改,全表扫描和索引查找的时间。
启用IM列存储时,Heat Map跟踪列数据的访问模式。例如,sales
表可以是“热的”,而locations
表可以是“冷的”。对于列式数据,ADO算法以与基于行的数据相同的方式工作。
数据库会定期将HeatMap数据写入数据字典。数据库在数据字典视图中显示Heat Map数据。例如,要获取内存中对象的读取和写入时间,请查询ALL_HEAT_MAP_SEGMENT
视图。
怎样进行策略评估工作
IM列存储策略的策略评估使用与其他ADO策略的评估相同的基础架构。数据库在维护窗口期间自动评估和执行策略。
数据库使用HeatMap统计来评估策略,它存储在数据字典中。设置INMEMORY
属性主要是元数据操作,因此对性能的影响最小。
ADO使用Job Scheduler执行填充。 In-MemoryCoordinator Process(IMCO)执行填充。
ADO和IM列存储的控制
使用 HEAT_MAP
初始化参数启用Heat Map。通过SQL和PL / SQL接口控制ADO。
DDL语句中的ILM子句
创建内存策略不需要新的SQL语句,但ILM子句有新的选项。下表描述了ADO和IM列存储的SQL选项。
表4-3 ADO和IM列存储的ILM子句
子句 | 描述 | 示例 |
---|---|---|
SET INMEMORY | 设置对象的INMEMORY 属性 | ALTER TABLE sh.sales ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY LOW PRIORITY HIGH SEGMENT AFTER 30 DAYS OF CREATION; |
MODIFY INMEMORY | 修改对象的压缩级别 | ALTER TABLE sh.customers ILM ADD POLICY MODIFY INMEMORY MEMCOMPRESS FOR QUERY HIGH PRIORITY CRITICAL SEGMENT AFTER 30 DAYS OF CREATION; |
NO INMEMORY | 设置对象的NO INMEMORY属性 | ALTER TABLE sh.products ILM ADD POLICY NO INMEMORY SEGMENT AFTER 30 DAYS OF CREATION; |
初始化参数
下表描述了与ADO和IM列存储相关的初始化参数。
表4-4 ADO和IM列存储的初始化参数
PL/SQLPackages
下表描述了与ADO和IM列存储相关的PL / SQL软件包
表4-5 ADO和IM列存储的PL/ SQL Packages
Package | 描述 |
---|---|
DBMS_HEATMAP | 在Tablespace、Segment、Object、 Extent和Block级别显示详细的Heat Map数据。 |
DBMS_ILM | 使用ADO策略实施ILM策略。 |
DBMS_ILM_ADMIN | 自定义ADO策略执行。 |
V$ 和数据字典视图
下表描述了与ADO和IM列存储相关的视图。
表4-6 ADO和IM列存储的视图
为IM列存储创建ADO策略
您可以使用ADO策略根据Heat Map统计信息设置、修改或删除对象的INMEMORY
子句。
要创建ADO IM列存储策略,请在ALTER TABLE
语句中指定ILM ADD POLICY
子句,后跟以下子句之一:
· SET INMEMORY ...SEGMENT
仅当 DML 活动减弱时,您想要标记段与INMEMORY
属性时,此选项很有用。
· MODIFY INMEMORY... MEMCOMPRESS ... SEGMENT
当频繁修改时,存储未压缩的数据或MEMCOMPRESS FOR DML级别是适当的。替代压缩级别更适合查询。如果段上的活动从大多数写入转换到大多数读取,则可以使用MODIFY子句应用不同的压缩方法。
· NO INMEMORY ...SEGMENT
当访问一个段随时间降低(它变成“冷”),并防止该段的随机接入结果的填充此选项是有用的。
先决条件
在使用ADOIM列存储策略之前,必须满足以下先决条件:
· 通过将INMEMORY_SIZE
初始化参数设置为非零值并重新启动数据库,为数据库启用IM列存储。
· HEAT_MAP
初始化参数必须设置为ON
。
HeatMap在段级提供数据访问跟踪,在段和行级提供数据修改跟踪。
· COMPATIBLE
初始化参数必须设置为12.2.0
或更高。
创建ADO策略:
1. 在SQL * Plus或SQLDeveloper中,使用必要的权限登录数据库。
2. 使用带有ILM ADD POLICY ... INMEMORY
子句的ALTER TABLE
语句。
示例4-16创建驱逐策略
在此示例中,您创建一个策略,指定如果在三天内未访问oe.order_items
表,则从IM列存储中逐出该表。 ADOIM列存储策略必须是段级策略。
ALTER TABLE oe.order_items ILM ADD POLICY
代码语言:javascript复制 NO INMEMORY SEGMENT
代码语言:javascript复制 AFTER 3 DAYS OF NO ACCESS;
示例4-17使用DBMS_ILM执行ILM策略Example4-17 Executing an ILM Policy Using DBMS_ILM
您还可以手动评估和执行策略。因此,您可以通过编程方式决定何时需要压缩或分层对象。以下示例手动执行sh.sales
的ADO任务:
DECLARE
代码语言:javascript复制 v_executonid NUMBER;
代码语言:javascript复制BEGIN
代码语言:javascript复制 DBMS_ILM.EXECUTE_ILM ( owner => 'SH',
代码语言:javascript复制 object_name => 'SALES',
代码语言:javascript复制 execution_mode => DBMS_ILM.ILM_EXECUTION_OFFLINE,
代码语言:javascript复制 task_id => v_executionid);
代码语言:javascript复制END;
代码语言:javascript复制/
山东Oracle用户组(Shandong Oracle User Group),简称:SDOUG,是一个充满朝气、年轻的非营利性组织,旨在为济南及周边地区技术爱好者提供一个交流平台。SDOUG会不定期组织线下技术分享活动,促进本地区及周边IT技术的发展、帮助技术爱好者提高自己。分享技术、分享快乐,SDOUG在路上。