共计 2899 个字符,预计需要花费 8 分钟才能阅读完成。
今天就跟大家聊聊有关 Oracle 12.2 怎样启用数据库对象的 In-Memory 转换填充,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
所谓数据库的列式转换填充,就是数据库从磁盘读取现有的行格式数据,将其转换为列格式,然后再存储到 IM 列存储中的过程。将数据库对象填充到列式存储会极大地提高访问效率。只有具有 In-Memory 属性的对象才能够做转换填充。
启用对象的列式填充的目的
IM 列存储不会自动将数据库中的所有对象加载到 IM 列存储中。如果不使用 DDL 将任何对象指定为 INMEMORY,则 IM 列存储将保持为空。将用户指定的 In-Memory 对象的行转换为列格式是必需的,以便它们可用于分析查询。
将磁盘上现有数据转换为列格式的填充与通常所说的列式填充不同,后者只是将新数据加载到 IM 列存储中。因为 IMCU 是只读结构,所以当行更改时,Oracle 数据库不会自动填充它们。而前者,则是数据库记录事务日志中的行修改记录,然后创建新的 IMCU 作为 IM 的一部分。
列式转换填充的原理
可以指定数据库在实例启动时或访问 INMEMORY 对象时填充 IM 列存储中的对象。列式转换填充算法在单实例数据库和 RAC 中有所区别。
DDL 语句包括一个 INMEMORY PRIORITY 子句,为子句队列提供更多的控制。
优先级设置适用于整个表,分区或子分区,而不适用于不同的列子集。在对象上设置 INMEMORY 属性意味着此对象是 IM 列存储中的填充的候选项。这并不意味着数据库会立即填充该对象。Oracle 数据库管理优先级如下:
1、按需填充
默认情况下,INMEMORY PRIORITY 参数设置为 NONE。在这种情况下,数据库仅在通过全表扫描访问对象时填充该对象。如果对象永远不被访问,或者只有通过索引扫描访问或者通过 rowid 进行访问,则不会发生转换。
2、基于优先级的填充
当 PRIORITY 设置为非 NONE 值时,Oracle 数据库将使用内部管理的优先级队列自动填充对象。在这种情况下,全扫描不是填充的必要条件。
基于优先级的填充过程如下:
a、在数据库实例重新启动后,自动填充 IM 列中的柱状数据
b、基于指定优先级的 INMEMORY 对象的队列人口
例如,使用 INMEMORY PRIORITY CRITICAL 更改的表优先于使用 INMEMORY PRIORITY HIGH 更改的表,该表依次优先于使用 INMEMORY PRIORITY LOW 更改的表。如果 IM 列存储空间不足,则 Oracle 数据库在空间可用之前不会填充其他对象。
c、等待从 ALTER TABLE 或 ALTER MATERIALIZED VIEW 语句返回,直到对象的更改记录在 IM 列存储中
在 IM 列存储中填充一个段后,数据库仅在段被删除或移动时才将其推离,或者使用 NO INMEMORY 属性更新段。可以手动或通过 ADO 策略驱逐细分。
在完成此示例之前,必须为数据库启用 IM 列存储。
1、以管理员身份登录数据库,然后查询客户表,如下所示:
2、显示查询的执行计划:
3、在 IM 列存储中启用 sh.customers 表的填充:
4、要确定 sh.customers 表中的数据是否已在 IM 列存储中填充,请执行以下查询(包括样本输出):
在这种情况下,由于 sh.customers 表尚未被扫描,因此在 IM 列存储中不会填充任何片段。
5、使用与步骤 1 中相同的语句查询 sh.customers:
6、查询游标显示数据库执行完整扫描并访问 IM 列存储:
7、再次查询 V$IM_SEGMENTS(包括样本输出):
8、DBA_FEATURE_USAGE_STATISTICS 视图确认数据库使用 IM 列存储来检索结果:
后台进程如何填充 IMCU
在填充期间,数据库以其行格式从磁盘读取数据,枢转行以创建列,然后将数据压缩为内存中压缩单元(IMCU)。
工作进程 (Wnnn) 填充 IM 列存储中的数据。每个工作进程在对象的数据库块的子集上运行。人口是一种流式传输机制,同时压缩数据并将其转换为柱状格式。
INMEMORY_MAX_POPULATE_SERVERS 初始化参数指定要用于 IM 列存储群体的 *** 工作进程数。默认情况下,该设置是 CPU_COUNT 的一半。将此参数设置为适合您的环境的值。更多的工作进程导致填充增长,但会占用更多的 CPU 资源。更少的工作进程导致人口减少,这降低了 CPU 开销。
列式填充控制
使用数据定义语言 (DDL) 语句中的 INMEMORY 子句来指定哪些对象有资格进入 IM 列存储。可以启用表空间,表,分区和物化视图。
INMEMORY 子句
INMEMORY 是一个段级属性,而不是列级属性。但是可以将 INMEMORY 属性应用于特定对象中的列的子集。
要启用或禁用 IM 列存储的对象,请在以下任何语句中指定 INMEMORY 子句:
1、CREATE TABLESPACE or ALTER TABLESPACE
默认情况下,表空间中的所有表和实例化视图都对 IM 列存储启用。表空间中的单个表和实例化视图可能具有不同的 INMEMORY 属性。单个数据库对象的属性将覆盖表空间的属性。
2、CREATE TABLE or ALTER TABLE
默认情况下,IM 列存储填充表中的所有非虚拟列。您可以指定表的全部或一部分列。例如,您可以将 oe.product_information 中的 weight_class 和 catalog_url 列从资格中排除。对于分区表,您可以填充 IM 列存储中的全部或一部分分区。默认情况下,对于分区表,所有表分区都将继承 INMEMORY 属性。
3、CREATE MATERIALIZED VIEW or ALTER MATERIALIZED VIEW
对于分区实体化视图,可以填充 IM 列存储中的所有或一部分分区。
DBA_TABLES 视图中的 INMEMORY 列指示哪些表具有 INMEMORY 属性设置 (ENABLED) 或未设置(DISABLED)。
以下对象不符合 IM 列存储中的填充资格:
索引; 索引组织表; 哈希集群; 由 SYS 用户拥有并存储在 SYSTEM 或 SYSAUX 表空间中的对象。
如果为 IM 列存储启用了表,并且它包含以下任何类型的列,则这些列将不会在 IM 列存储中填充:
行列(varrays,嵌套表列和行外 LOB)
使用 LONG 或 LONG RAW 数据类型的列
扩展数据类型列
对表进行列式填充
假设以用户 sh 连接到数据库。可以使用默认压缩级别 FOR QUERY LOW(参见“内存中压缩”),为 IM 列存储中的用户表启用客户表:
列式填充的优先级选项
为 IM 列存储启用数据库对象时,可以启用 Oracle 数据库来控制对象在 IM 列存储中的填充(默认),也可以指定确定对象的优先级。
Oracle SQL 包括一个 INMEMORY PRIORITY 子句,为群体提供了对队列的更多控制。例如,在填充其他数据库对象的数据之前,填充数据库对象的数据可能更重要或更不重要。
下表说明了支持的优先级。
看完上述内容,你们对 Oracle 12.2 怎样启用数据库对象的 In-Memory 转换填充有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。