【体系结构】09.内存中列式存储区(In-Memory Area)

In-Memory存储区是一个可选的SGA组件,其中包含内存中列存储(IM列存储),该存储区使用针对快速扫描进行了优化的列格式将表和分区存储在内存中。IM列存储使数据能够以传统的行格式(在缓冲区⾼速缓存中)和列格式同时在SGA中填充。数据库透明地将在线事务处理(OLTP)查询(例如主键查找)发送到缓冲区⾼速缓存,并将分析和报告查询发送到IM列存储。在获取数据时,Oracle数据库还可以从同一查询中的两个内存区域读取数据。双格式体系结构不会使内存需求加倍。缓冲区⾼速缓存经过优化,可以以比数据库小得多的大小运行。
您应该仅在IM列存储中填充关键的数据。要将对象添加到IM列存储中,请在创建或更改对象时为该对象打开INMEMORY属性。您可以在表空间(对于表空间中的所有新表和视图),表,(子)分区,物化视图或对象内的列子集上指定此属性。
IM列存储以优化的存储单元(而不是传统的Oracle数据块)管理数据和元数据。内存中压缩单元(IMCU)是一种压缩的只读存储单元,其中包含一个或多个列的数据。快照元数据单元(SMU)包含相关IMCU的元数据和事务信息。每个IMCU都映射到一个单独的SMU。
表达式统计信息存储(ESS)是一个存储有关表达式评估的统计信息的存储库。ESS驻留在SGA中,并且也保留在磁盘上。启用IM列存储后,数据库会将ESS用于其内存中表达式(IM表达式)功能。内存中表达单元(IMEU)是用于存储实现的IM表达式和用户定义的虚拟列的存储容器。请注意,ESS独⽴于IM列存储。ESS是数据库的永久组件,不能禁用。
从概念上讲,IMEU是其⽗IMCU的逻辑扩展。就像IMCU可以包含多个列一样,IMEU可以包含多个虚拟列。每个IMEU都恰好映射到一个IMCU,映射到同一行集。IMEU包含与其关联的IMCU中包含的数据的表达结果。填充IMCU后,还将填充关联的IMEU。
典型的IM表达式包含一列或多列(可能带有常量),并且与表中的行具有一对一的映射关系。例如,一个EMPLOYEES表的IMCU包含Weekly_salary列的1-1000行。对于此IMCU中存储的行,IMEU计算⾃动检测到的IM表达式weekly_salary*52,并将用户定义的虚拟列Quarterly_salary定义为weekly_salary*12。IMCU中的第三行下映射到IMEU中的第三行下。
In-Memory区细分为两个池:一个1MB列式数据池,用于存储填充到内存中的实际列格式数据(IMCU和IMEU),以及一个64K元数据池,用于存储有关对象的元数据。填充到IM列存储中。这两个库的相对大小由内部启发算法确定。In-Memory区中的大部分内存都分配给1MB池。内存区域的大小由初始化参数INMEMORY_SIZE(默认值为0)控制,并且小大小必须为100MB。从OracleDatabase12.2开始,您可以通过ALTERSYSTEM命令将INMEMORY_SIZE参数增加⾄少128MB,来动态增加内存区域的大小。请注意,⽆法动态缩小内存区域的大小。
In-Memory表在⾸次访问表数据或数据库启动时会获取在IM列存储中分配的IMCU。通过从磁盘格式转换为新的内存列式格式,可以创建表的内存副本。每次实例重新启动时都会完成此转换,因为IM列存储副本仅驻留在内存中。完成此转换后,表的内存版本逐渐可用于查询。如果对表进行了部分转换,则查询能够使用部分内存版本并转到磁盘进行其余操作,而不必等待整个表都被转换。
为了响应查询和数据操作语⾔(DML),服务器进程扫描列数据并更新SMU元数据。后台进程将磁盘中的行数据填充到IM列存储中。In-Memory协调进程(IMCO)是启动后台填充和重新填充列式数据的后台进程。空间管理协调进程(SMCO)和空间管理⼯作进程(Wnnn)是后台进程,它们代表IMCO实际填充和重新填充数据。DML块更改将写⼊缓冲区⾼速缓存,然后再写⼊磁盘。然后,后台进程根据元数据失效和查询请求将磁盘中的行数据重新填充到IM列存储中。
您可以启用In-Memory快速启动功能,以将IM列存储中的列数据以压缩列格式写回到数据库中的表空间。此功能使数据库启动更快。请注意,此功能不适用于IMEU,它们总是从IMCU动态填充。

浙公网安备 33010602011771号