1 Oracle Database In-Memory 相关概念
Oracle Database In-Memory(In-Memory数据库)最先是在Oracle Database 12c第1版(12.1.0.2)中引入的功能,可大大提高实时分析和混合工作负载的性能。 In-Memory列存储(IM列存储)是Database In-Memory的关键功能。
传统方面,为分析查询获得良好的性能意味着能够满足许多要求。
在典型的数据仓库或混合使用的数据库中,要求包括以下内容:
例如,如果为了使OLTP应用程序能够提供良好的性能,给一张表(1个主键和2个外键索引)创建1到3个索引,则可能还需要创建其他索引使其能够为分析查询提供良好的性能。
满足上述要求会产生可管理性和性能问题。 其他访问结构会导致性能开销,因为您必须创建,管理和调整它们。 例如,将单行数据插入到表中,则需要更新此表上的所有索引,这会增加响应的时间。
对于实时分析的需求,意味着在混合工作负载数据库中执行更多的分析查询。 传统的方法是不可持续的。
传统方面,关系数据库以行或列格式存储数据。 内存和磁盘也以相同的格式存储数据。
Oracle数据库在数据块中连续存储行。 例如,在具有三行的表中,Oracle数据块先存储第一行,然后存储第二行,然后存储第三行。 每行包含该行的所有列值。 以行格式存储的数据,针对事务处理进行了优化。 例如,更新少量行中的所有列可以仅修改少量的块。
为了解决与分析查询相关的问题,一些数据库供应商引入了列格式。 列式数据库存储选定的列,而不是行连续。 例如,在大型销售表中,销售ID位于一列中,销售区域位于不同的列中。
分析工作负载在扫描时访问几个列,但他也要扫描整个数据集。 因此,列格式对于分析最有效。 由于列是单独存储的,因此分析查询只能访问所需的列,并避免读取不必要的数据。 例如,按地区划分的销售总额报告只需访问几个列就可以快速处理许多行。
数据库供应商通常强制客户在列式和基于行的格式之间进行选择。 例如,如果数据格式为纵向的,则数据库将数据以列形式存储在内存和磁盘上。 获得一种格式的优点意味着就要丢失备用格式的优点。 应用程序可以实现快速分析或快速事务,但不是两者同时具备。 混合使用数据库的性能问题不能通过以单一格式存储数据来解决。
Oracle Database In-Memory(Database In-Memory)功能集包括内存中列存储(IM列存储),高级查询优化和可用性解决方案。
Database In-Memory 优化使分析查询能够在数据仓库和混合使用数据库上运行更快的数量级。
Database In-Memory 功能集包括IM列存储、高级查询优化和可用性解决方案。 这些功能结合了在不牺牲OLTP性能或可用性的情况下加快分析查询的数量级。
IM 列存储
IM列存储以特殊的压缩列格式保存表、分区和单独列的副本,该格式针对快速扫描进行了优化。 IM列存储驻留在内存区域(In-Memory Area)中,它是系统全局区域(SGA)的可选部分。
IM列存储并不替换基于行的存储或数据库缓冲区高速缓存,而是做为补充。 数据库允许数据以基于行和列的格式存储在内存中,从而提供两者的最佳性能。 IM列存储提供独立于磁盘格式的表数据的附加事务一致性副本。 在IM列存储中填充的对象也不需要加载到缓冲区高速缓存中。
使用DDL语句中的 INMEMORY 子句在以下任意级别启用IM列存储:
如果在表空间级别指定 INMEMORY
属性,则缺省情况下,将为表空间中的所有新表和物化视图启用IM列存储。 在 Database In-Memory 中,population是将磁盘上基于行的数据自动转换为IM列存储中的列数据。 您可以配置IM列存储中用于填充的数据库对象的列的全部或子集。 类似地,对于分区表或物化视图,您可以配置全部或分区的子集。
例如,可以将sh schema中的三个表配置为填充到IM列存储:customer,product和sales中。 IM列存储按列而不是按行存储每个表的数据,并将每个列划分为单独的行子集。 称为内存压缩单元(IMCU)的特殊容器存储表段中行的子集的所有列。
高级查询优化
Database In-Memory包括针对分析查询的多个性能优化。 优化包括:
DETERMINISTIC
)的组合,可解析为值。 默认情况下,In-Memory Expression(IM表达式)优化使DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS过程能够识别和填充IM列存储中的“热”表达式。 IM表达式被实现为隐藏的虚拟列,但是以与非虚拟列相同的方式访问。VECTOR GROUP BY
操作来提高性能。 在实体表扫描期间优化聚合数据而不是之后。可高用支持
可用性是指按需访问应用程序、服务或功能的程度。 Database In-Memory 支持以下可用性功能:
因为IM列存储以压缩列格式填充数据库对象,所以Oracle数据库可以执行更快的扫描、查询、联接和聚合。
列格式为扫描大量数据提供了快速吞吐量。 您可以实时分析数据,使您可以探索不同的可能性和执行迭代。
IM列存储可以大幅提高以下类型查询的性能:
对于大多数数字和短字符串数据类型,列格式使用固定宽度的列。 此优化支持快速向量处理,使数据库能够更快地应答查询(请参见“CPU体系结构:SIMD Vector Processing”)。
由于以下原因,IM列存储的扫描比基于行的数据的扫描更快:
WHERE
子句谓词的算法自动压缩列数据。 根据应用的压缩类型,Oracle数据库可以以其压缩格式扫描数据,而无需首先对其进行解压缩。 因此,数据库必须在IM列存储中扫描的数据量小于数据库缓冲区高速缓存中的相应卷。例如,假设用户执行以下即席查询:
SELECT cust_id, time_id, channel_id
FROM sales
WHERE prod_id BETWEEN 14 and 29
当使用缓冲区高速缓存时,数据库通常会扫描索引以查找产品ID,使用rowids从磁盘中取出行到缓冲区高速缓存中,然后丢弃不需要的列值。 在缓冲区高速缓存中以行格式扫描数据需要许多CPU指令,并且可能导致次优的CPU效率。
使用IM列存储时,数据库只能扫描请求的 sales 列,避免使用磁盘。 以列格式管道扫描数据只需要向CPU提供必要的列,从而提高效率。 每个CPU内核使用SIMD向量指令扫描本地内存中列。
Bloom filter是一种低内存数据结构,用于测试集合中的成员资格。 IM列存储利用Bloom过滤器来提高连接的性能。
Bloom过滤器通过将小维度表上的谓词转换为大型实体表上的过滤器来加速连接。 当使用一个大实体表执行多个维度的联接时,此优化很有用。 实体表上的维度键有很多重复值。 扫描性能和重复值优化加快连接数量级。
分析的一个重要方面是通过聚合数据来确定模式和趋势。 当数据存储在IM列存储中时,聚合和复杂SQL查询运行速度更快。
在Oracle数据库中,聚合通常涉及 GROUP BY
子句。 传统上,数据库使用 SORT
和 HASH
运算符。 从Oracle Database 12c Release 1(12.1)开始,数据库提供了 VECTOR GROUP BY
转换以启用高效的内存中基于数组的聚合。
在实体表扫描期间,数据库将聚合值累积到内存数组中,并使用高效算法执行聚合。 基于主键和外键关系的连接针对星型模式和雪花模式进行了优化。
(本章未完,待续)
山东Oracle用户组(Shandong Oracle User Group),简称:SDOUG,是一个充满朝气、年轻的非营利性组织,旨在为济南及周边地区技术爱好者提供一个交流平台。SDOUG会不定期组织线下技术分享活动,促进本地区及周边IT技术的发展、帮助技术爱好者提高自己。分享技术、分享快乐,SDOUG在路上。