所谓数据库的列式转换填充,就是数据库从磁盘中读取已有的行格式数据,转换成列格式,然后存入IM列存储进程。将数据库对象填充到列式存储中可以大大提高访问效率。只有具有In-Memory属性的对象才能转换和填充。启用对象列填充的目的是IM列存储不会自动将数据库中的所有对象加载到IM列存储中。如果没有使用DDL将对象指定为INMEMORY,则IM列存储将保持为空。需要将用户指定的In-Memory对象的行转换为列格式,以便它们可以用于分析查询。将磁盘上的现有数据转换为列式格式的填充不同于通常所说的列式填充,后者只是将新数据加载到IM列存储中。因为IMCU是只读结构,Oracle数据库不会在行更改时自动填充它们。前者,数据库在事务日志中记录行修改记录,然后创建一个新的IMCU作为IM的一部分。列式转换填充的原理可以指定数据库在实例启动时或访问INMEMORY对象时填充IM列存储中的对象。列式转换填充算法在单实例数据库和RAC中是不同的。DDL语句包括一个INMEMORYPRIORITY子句以提供对子句队列的更多控制。优先级设置适用于整个表、分区或子分区,而不适用于列的不同子集。在对象上设置INMEMORY属性意味着该对象是填充到IM列存储中的候选者。这并不意味着数据库会立即填充对象。Oracle数据库管理优先级如下:1.按需填写默认情况下,INMEMORYPRIORITY参数设置为NONE。在这种情况下,数据库仅在通过全表扫描访问对象时填充该对象。如果从未访问过该对象,或者仅通过索引扫描或通过rowid访问该对象,则不会发生转换。2.基于优先级的填充当PRIORITY设置为非NONE值时,Oracle数据库将使用内部管理的优先级队列自动填充对象。在这种情况下,填充不需要全扫描。基于优先级的填充过程如下:a.数据库实例重启后,IM列中的列数据自动填充b。基于指定优先级的INMEMORY对象的队列填充例如,使用INMEMORYPRIORITYCRITICAL更改的表优先于使用INMEMORY使用PRIORITYHIGH更改的表,后者又优先于使用INMEMORYPRIORITYLOW更改的表。如果IM列存储空间不足,Oracle数据库将不会填充其他对象,直到空间可用为止。C。等待从ALTERTABLE或ALTERMATERIALIZEDVIEW语句返回,直到对象的更改记录在IM列存储中。在IM列存储中填充段后,数据库仅在删除或移动该段时将其推下,或者使用NOINMEMORY属性更新该段。可以手动或通过ADO策略逐出段。在完成此示例之前,必须为数据库启用IM列存储。1、以管理员身份登录数据库,然后查询customer表,如下图:2、显示查询的执行计划:3、启用IM列存储中sh.customers表的填充:4.确定sh.customers表如果数据已经填充到IM列存储中,执行下面的查询(有示例输出):在这种情况下,不会在IM列存储中填充任何片段,因为sh.customers表尚未扫描。5.使用与步骤1中相同的语句查询sh.customers:6.查询光标显示数据库执行全扫描并访问IM列存储:7.再次查询V$IM_SEGMENTS(包括示例输出):8.DBA_FEATURE_USAGE_STATISTICS视图确认数据库使用IM列存储以检索结果:后台进程如何填充IMCU内存压缩单元(IMCU)。工作进程(Wnnn)填充IM列存储中的数据。每个工作进程都对对象的数据库块的一个子集进行操作。Population是一种流机制,它同时压缩数据并将其转换为柱状格式。INMEMORY_MAX_POPULATE_SERVERS初始化参数指定用于IM列存储填充的最大工作进程数。默认情况下,此设置是CPU_COUNT的一半。将此参数设置为适合您环境的值。更多的工作进程会导致人口增长,但会消耗更多的CPU资源。较少的工作进程导致较小的人口,从而减少CPU开销。列填充控制在数据定义语言(DDL)语句中使用INMEMORY子句来指定哪些对象有资格进入IM列存储。可以启用表空间、表、分区和物化视图。INMEMORY子句INMEMORY是段级属性,而不是列级属性。但是可以将INMEMORY属性应用于特定对象中的列子集。要为IM列存储启用或禁用对象,请在以下任何语句中指定INMEMORY子句:1.CREATETABLESPACE或ALTERTABLESPACE默认情况下,表空间中的所有表和物化视图都启用IM列存储。表空间中的各个表和物化视图可能具有不同的INMEMORY属性。单个数据库对象的属性会覆盖表空间的属性。2.CREATETABLE或ALTERTABLE默认情况下,IM列存储填充表中的所有非虚拟列。您可以指定表格的全部或部分列。例如,您可以将oe.product_information中的weight_class和catalog_url列排除在资格之外。对于分区表,您可以填充IM列存储中的所有或部分分区。默认情况下,对于分区表,所有表分区都将继承INMEMORY属性。3.CREATEMATERIALIZEDVIEWorALTERMATERIALIZEDVIEW对于分区物化视图,可以填充IM列存储中的全部或部分分区。DBA_TABLES视图中的INMEMORY列指示哪些表设置了(ENABLED)或未设置(DISABLED)INMEMORY属性。以下对象不符合在IM列存储中填充的条件:索引;索引组织表;散列簇;SYS用户拥有并存储在SYSTEM或SYSAUX表空间中的对象。如果为IM列存储启用了表并且它包含以下任何类型的列,则这些列将不会填充到IM列存储中:行列(varrays、嵌套表列和行外LOB)使用LONG或LONGRAW数据扩展数据类型列类型的列填充表columnar假设用户sh已连接到数据库。可以使用默认压缩级别FORQUERYLOW为IM列存储中的用户表启用客户表(请参阅“内存中压缩”):列填充的优先选项当为IM列存储启用数据库对象时,Oracle数据库可以启用以控制IM列存储中对象的数量(默认),也可以指定以确定对象的优先级。OracleSQL包含一个INMEMORYPRIORITY子句,该子句为组提供了对队列的更多控制。例如,填充一个数据库对象的数据可能比填充其他数据库对象的数据更重要或更不重要。下表描述了支持的优先级。
