前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第一章 Oracle Database In-Memory 相关概念(IM-1.1)

第一章 Oracle Database In-Memory 相关概念(IM-1.1)

作者头像
Grainger
发布2022-04-23 09:28:46
1.1K0
发布2022-04-23 09:28:46
举报
文章被收录于专栏:数据与未来数据与未来

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的关键功能。

分析应用程序的挑战

传统方面,为分析查询获得良好的性能意味着能够满足许多要求。

在典型的数据仓库或混合使用的数据库中,要求包括以下内容:

  • 您必须了解用户访问模式。
  • 您必须提供良好的性能,这通常需要创建索引,物化视图和OLAP多维数据集。

例如,如果为了使OLTP应用程序能够提供良好的性能,给一张表(1个主键和2个外键索引)创建1到3个索引,则可能还需要创建其他索引使其能够为分析查询提供良好的性能。

图 1-1 多个索引

满足上述要求会产生可管理性和性能问题。 其他访问结构会导致性能开销,因为您必须创建,管理和调整它们。 例如,将单行数据插入到表中,则需要更新此表上的所有索引,这会增加响应的时间。

对于实时分析的需求,意味着在混合工作负载数据库中执行更多的分析查询。 传统的方法是不可持续的。

单一格式用途

传统方面,关系数据库以行或列格式存储数据。 内存和磁盘也以相同的格式存储数据。

Oracle数据库在数据块中连续存储行。 例如,在具有三行的表中,Oracle数据块先存储第一行,然后存储第二行,然后存储第三行。 每行包含该行的所有列值。 以行格式存储的数据,针对事务处理进行了优化。 例如,更新少量行中的所有列可以仅修改少量的块。

为了解决与分析查询相关的问题,一些数据库供应商引入了列格式。 列式数据库存储选定的列,而不是行连续。 例如,在大型销售表中,销售ID位于一列中,销售区域位于不同的列中。

分析工作负载在扫描时访问几个列,但他也要扫描整个数据集。 因此,列格式对于分析最有效。 由于列是单独存储的,因此分析查询只能访问所需的列,并避免读取不必要的数据。 例如,按地区划分的销售总额报告只需访问几个列就可以快速处理许多行。

数据库供应商通常强制客户在列式和基于行的格式之间进行选择。 例如,如果数据格式为纵向的,则数据库将数据以列形式存储在内存和磁盘上。 获得一种格式的优点意味着就要丢失备用格式的优点。 应用程序可以实现快速分析或快速事务,但不是两者同时具备。 混合使用数据库的性能问题不能通过以单一格式存储数据来解决。

Oracle数据库 In-Memory 解决方案

Oracle Database In-Memory(Database In-Memory)功能集包括内存中列存储(IM列存储),高级查询优化和可用性解决方案。

Database In-Memory 优化使分析查询能够在数据仓库和混合使用数据库上运行更快的数量级。

Database In-Memory 是什么?

Database In-Memory 功能集包括IM列存储、高级查询优化和可用性解决方案。 这些功能结合了在不牺牲OLTP性能或可用性的情况下加快分析查询的数量级。

IM 列存储

IM列存储以特殊的压缩列格式保存表、分区和单独列的副本,该格式针对快速扫描进行了优化。 IM列存储驻留在内存区域(In-Memory Area)中,它是系统全局区域(SGA)的可选部分。

IM列存储并不替换基于行的存储或数据库缓冲区高速缓存,而是做为补充。 数据库允许数据以基于行和列的格式存储在内存中,从而提供两者的最佳性能。 IM列存储提供独立于磁盘格式的表数据的附加事务一致性副本。 在IM列存储中填充的对象也不需要加载到缓冲区高速缓存中。

图1-2双格式数据库

使用DDL语句中的 INMEMORY 子句在以下任意级别启用IM列存储:

  • 列 (nonvirtual or virtual)
  • 表, 物化视图, 分区
  • 表空间

如果在表空间级别指定 INMEMORY 属性,则缺省情况下,将为表空间中的所有新表和物化视图启用IM列存储。 在 Database In-Memory 中,population是将磁盘上基于行的数据自动转换为IM列存储中的列数据。 您可以配置IM列存储中用于填充的数据库对象的列的全部或子集。 类似地,对于分区表或物化视图,您可以配置全部或分区的子集。

例如,可以将sh schema中的三个表配置为填充到IM列存储:customer,product和sales中。 IM列存储按列而不是按行存储每个表的数据,并将每个列划分为单独的行子集。 称为内存压缩单元(IMCU)的特殊容器存储表段中行的子集的所有列。

高级查询优化

Database In-Memory包括针对分析查询的多个性能优化。 优化包括:

  • 表达式是一个或多个值、运算符和SQL函数(仅DETERMINISTIC)的组合,可解析为值。 默认情况下,In-Memory Expression(IM表达式)优化使DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS过程能够识别和填充IM列存储中的“热”表达式。 IM表达式被实现为隐藏的虚拟列,但是以与非虚拟列相同的方式访问。
  • Join group 是用户定义的对象,用于指定连接查询中的两个或多个表的列。 在某些查询中,连接组使数据库能够消除解压缩和散列列值的性能开销。
  • 对于将小维度表连接到大型实体表的聚合查询,In-Memory Aggregation(IM聚合)使用 VECTOR GROUP BY 操作来提高性能。 在实体表扫描期间优化聚合数据而不是之后。
  • 在IM列存储中,重新填充是IMCU的数据在其中的数据被显着修改后的自动更新。 如果IMCU具有过时的条目但不满足过时阈值,则后台进程可以引起涓流重新填充,这是IM列存储的逐渐重新填充。

可高用支持

可用性是指按需访问应用程序、服务或功能的程度。 Database In-Memory 支持以下可用性功能:

  • In-Memory FastStart(IM FastStart)减少了在数据库实例重新启动时将数据填充到IM列存储的时间。 IM FastStart 通过以压缩列格式定期保存磁盘上当前填充在IM列存储中的数据副本来实现此目的。
  • Oracle Real Application Clusters(Oracle RAC)环境中的每个节点都有自己的IM列存储。 可以在每个节点上填充完全不同的对象,或者使更大的对象分布在集群中的所有IM列存储上。 在工程化系统中,也可以在每个节点上的IM列存储中显示相同的对象。
  • 从Oracle Database 12c第2版(12.2)开始,Active Data Guard环境中的备库支持IM列存储。

提高分析查询的性能

因为IM列存储以压缩列格式填充数据库对象,所以Oracle数据库可以执行更快的扫描、查询、联接和聚合。

提高数据扫描的性能

列格式为扫描大量数据提供了快速吞吐量。 您可以实时分析数据,使您可以探索不同的可能性和执行迭代。

IM列存储可以大幅提高以下类型查询的性能:

  • 用于扫描大量行并应用使用诸如<、>、=和IN等运算符的过滤器的查询
  • 从表或具有大量列的物化视图中选择少量列的查询,例如访问100列中5个的查询

对于大多数数字和短字符串数据类型,列格式使用固定宽度的列。 此优化支持快速向量处理,使数据库能够更快地应答查询(请参见“CPU体系结构:SIMD Vector Processing”)。

由于以下原因,IM列存储的扫描比基于行的数据的扫描更快:

  • 消除缓冲区高速缓存开销 IM列存储以纯in-memory列格式存储数据。 数据不会保留在数据文件中(或生成redo),因此数据库避免了将数据从磁盘读入缓冲区高速缓存的开销。
  • 数据修剪 数据库仅扫描查询所需的列,而不是整个数据行。 此外,数据库使用存储索引和内部字典来仅读取特定查询所需的IMCU。 例如,如果查询请求商店ID小于8的商店的所有销售,则数据库可以使用IMCU修剪来消除不包含此值的IMCU。
  • 压缩 传统上,压缩的目的是节省空间。 在IM列存储中,压缩的目标是加速扫描。 数据库使用允许对压缩格式应用 WHERE 子句谓词的算法自动压缩列数据。 根据应用的压缩类型,Oracle数据库可以以其压缩格式扫描数据,而无需首先对其进行解压缩。 因此,数据库必须在IM列存储中扫描的数据量小于数据库缓冲区高速缓存中的相应卷。
  • 矢量处理 每个CPU核心扫描本地内存列。 将数据作为数组(集合)进行处理,扫描将使用SIMD向量指令。 例如,查询可以读取单个CPU指令中的一组值,而不是逐个读取值。 CPU核心的矢量扫描比行扫描快几个数量级。

例如,假设用户执行以下即席查询:

代码语言:javascript
复制
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 子句。 传统上,数据库使用 SORTHASH 运算符。 从Oracle Database 12c Release 1(12.1)开始,数据库提供了 VECTOR GROUP BY 转换以启用高效的内存中基于数组的聚合。

在实体表扫描期间,数据库将聚合值累积到内存数组中,并使用高效算法执行聚合。 基于主键和外键关系的连接针对星型模式和雪花模式进行了优化。

(本章未完,待续)

山东Oracle用户组(Shandong Oracle User Group),简称:SDOUG,是一个充满朝气、年轻的非营利性组织,旨在为济南及周边地区技术爱好者提供一个交流平台。SDOUG会不定期组织线下技术分享活动,促进本地区及周边IT技术的发展、帮助技术爱好者提高自己。分享技术、分享快乐,SDOUG在路上。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 山东Oracle用户组 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析应用程序的挑战
  • 单一格式用途
  • Oracle数据库 In-Memory 解决方案
    • Database In-Memory 是什么?
      • 提高分析查询的性能
        • 提高数据扫描的性能
        • 改善联接的性能
        • 提高聚合性能
    相关产品与服务
    文件存储
    文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档