IMO列式存储原理

  • 下图是IMO特性的原理图,通过在内存中开辟一块独立的区域,来分离分析业务的应用。
  • Oracle将指定的表或者分区在新开辟的内存区域内,以列式内存独立存储。
  • 在存储上,仍然以一份行式存储,这意味着IMO需要额外的内存空间。
  • IMO特性较为有利于只读的大数据量分析业务,对于并发短事务处理并不擅长。

12cIMO_03

IM内存池实现

  • 在SGA内存区域中开辟的一个全新的内存池,作为IM列式存储区域。
  • 仅有一份段对象以行式存储格式保存在磁盘空间上。
  • 在IM内存池中的段均为列式存储格式,并与Buffer Cache保持事务一致性。
  • 在事务处理中,IM表更像是基表的索引,SQL仅负责数据的更改,事务的一致性由IMO后台进程来处理。

12cIMO_04

数据分布对比

  • 在列式存储的格式中,原本类型和长度相同或相似的列以行的形式存储在内存中,更有利于空间节省和压缩。

12cIMO_05

双重数据格式共同作用
12cIMO_06

如何启用数据库IMO功能

  • 使用IMO功能,首先需要在SGA区域预设一个IM内存区域;
  • 然后需要DBA给特定对象指定INMEMORY属性,该属性可以在对象创建伊始指定,也可以在创建后追加;
  • 当触发IM对象全表扫描的时候,该对象将被复制到IM内存区域,同时需完成行列格式的转换,加载完成后,即可使用其进行查询优化了;
  • 因为IM区域位于SGA区域中,当实例重启后,IM内存将被清空,对象需要重载。

IMO功能特有后台进程

  • IMCO:一个调度进程,负责IM内存数据的加载和重载的计划调度,它不是一直处于工作状态的,每两分钟会触发一次。
  • SMCO/Wnnn:该两个后台进程是实际去执行IM对象加载和重载工作的进程,Wnnn可以开启多进程并行工作,由参数INMEMORY_MAX_POPULATE_SERVERS控制,增加其数量可以提供加载效率,但是需要平衡CPU负载,IM对象加载过程是一个非常消耗CPU资源的过程。
  • IMCO/SMCO/Wnnn三个进程同时作用,完成IMCU与TX Journal的数据同步,可以保障事务处理过程中的事务一致性。

什么是IMCU(In Memory Compression Units)

  • IMCU类似于表空间中extent的概念,是列数据在IM区中内存分配块的大小。后台进程Wnnn在装载数据时,会分配自己的IMCU,并将分配给该进程的数据加载到该IMCU中。
  • 当访问IM区中的列数据时,我们在统计信息中看到的consistent gets值也就是统计所访问IMCU的个数和所需访问metadata块的个数之和。
  • 特定对象所分配IMCU的详细信息,可从视图V$IM_HEADER中查询。而其metadata块的信息可从视图V$IM_SMU_CHUNK和V$IM_SMU_HEAD查询。
  • 在IM内部,以IMCU为单位,Oracle维护了一个In Memory Storage Index,记录IMCU单元中该列的最大值,最小值。
  • Oracle也会在metadata区为每个IMCU建立相应的metadata数据字典。metadata信息中有一些列的统计信息。视图V$IM_COL_CU可以帮助查询这些metadata数据字典信息。

IMO功能查询优化支持

  • 使用IMO功能进程查询优化,对于应用是完全透明的:
  • 不需要特有的架构支持
  • 不需要修改业务SQL逻辑
  • 无需数据迁移及更改备份策略
  • 可以实现会话级别的IMO查询优化支持的开启与关闭
    SQL> ALTER SESSION SET INMEMORY_QUERY = [ENABLE/DISABLE];

IMO功能事务处理支持

  • 每个IMCU都有一个对应的Transaction Jouranl的内存结构,用于保持其事务的读一致性,该内存区域由Oracle 自动维护,其作用类似于IMCU的UNDO段。
  • 当IMCU发生DML操作时,更新的条目会保持在Transaction Jouranl内存中,IMCU中仍会保留过期的条目,来保证事务的读一致性。同样是通过SCN来控制的。
  • 当IMCU的过期数据达到一定阀值,触发IMCO进行涓流重载(trickle repopulation),刷新Transaction Jouranl的数据到IMCU中。
  • 如果重载不及时,Transaction Jouranl内存容量过大,会导致IMCU性能降低,过于频繁的重载又会增加CPU的的消耗。
  • 涓流重载过程的负载工作量由INMEMORY_TRICKLE_REPOPULATE_SERVERS_PERCENT参数决定。

IMO特性支持对象

  • 列(Column)
  • 表(Table)
  • 物化视图(Materialized view)
  • 分区(Partition)
  • 表空间(Tablespace)

注意:由于内存的资源有效,从节省资源与降低维护成本方面考虑,均不建议将整个表空间进行IMO缓存。

IMO特性支持版本

  • IMO特性在Oracle 12c的12.1.0.2发行版中,首次引进,之前的版本不可使用。
  • COMPATIBLE = 12.1.0.0.0,意味着IMO特性在12c版本之前无法兼容。

IMO特性不支持的对象

  • 所有属主为SYS和SYSTEM用户的,且保存在SYSTEM或SYSAUX表空间内的对象。
  • 索引组织结构表(IOTs)
  • 聚簇表
  • LONG字段类型
  • 行外存储的LOB字段类型

建议:容量小于1M的对象不要进行IMO缓存,IM内存区域最小存储单元(chunk)为1M。

Trackback

no comment untill now

Add your comment now

切换到手机版