内存列式存储 vs Buffer Cache

Oracle DB 12c的In-Memory选项(DBIM)将表中列的所有行的数据载入内存,为何不能像Buffer Cache那样只把频繁访问的数据块置入内存中呢?

内存列式存储和Buffer Cache的访问模式

原因是两者支持的访问模式不同,对于Buffer Cache,支持的是OLTP应用,访问模式为non-uniform access patterns,也就是说表中的某些行访问比其它行频繁,因此才能通过只缓存10%的数据,就可以涵盖95%的数据访问。可以假设缓存10%的数据就可以得到20倍的性能提升。

而内存列式存储支持的是分析型应用,访问的是少数列,但却需要扫描表中所有行的数据。缓存部分行的数据意义不大,例如如果内存列式存储可以得到100倍性能提升,如果只缓存表中10%的数据只能得到1.1倍的性能提升,而不是100倍。所以在DBIM的设置中,你可以指定全表,表中的部分列,部分分区,表空间,但你无法用where条件指定只缓存列中的部分行。

所以对于分析性的应用,之所以内存列式存储比行式存储(即使是通过alter table tablename cache 全部缓存到内存)快,最重要的原因就是列存储的格式非常适合分析性应用。

列存储格式

以下的图很好的说明了为何列式存储适合分析。

如果采用传统的行式存储来进行分析,例如查询第4列,这时需要逐行访问,需要查询第1到第3列这些无关数据。

如果是采用列式存储,则只需要访问第4列即可,避免了无效I/O,效率自然提升了。

看一下Oracle在Open World 2013上发布的测试结果:

行式和列式都是在内存中,DBIM快了近800倍,单个core每1/6秒处理30亿行数据,难以置信?!

SIMD

这时以前在高性能计算和图像处理中使用的技术,即Single Instruction Multiple Data,其实就是对于数据的批处理,只不过其非常适合列式数据。

storage index

storage index其实在Exadata中就有了,其实就是将列分区为IMCU,预先计算和实时维护好每一个IMCU中的最大和最小值,查询时匹配where条件,就可以跳过许多无关的IMCU,从而节省I/O和时间。原理上和分区是类似的。

不过数据库重启后需要重新计算。

压缩

列式存储通常都会压缩,因为其中的数据重复值较多,DBIM中压缩是缺省的选项。

压缩不仅可以在内存中缓存更多的数据,而且还可以减少I/O。不过考虑到如果有较多OLTP的访问,这时不要选取压缩比较高的压缩方式,以免压缩和解压时消耗过多的资源。

内存中Join和Aggregation的优化

通过Bloom Filter将Join转换为列扫描可以加快Join速度,在内存中更是如此。

而通过key vector,原理与Bloom Filter类似,也可以在线构建聚集表的结果,具体原理看白皮书。

参考

In-Memory Column Store versus the Buffer Cache

时间: 2024-10-13 16:00:30

内存列式存储 vs Buffer Cache的相关文章

内存列式存储

内存列式存储(IM column store)(此特性在12cr1(12.1.0.2)版本后开始可用)是系统全局区中一个可选的部分,表中的数据是以列的形式而不是行的形式存储在内存里面的,如下图所示.在针对某列作查询的应用场景中,列式存储能极大地提升语句的执行速度. IM的列存储在SGA中一个新的静态池.传统的表数据是以行为单位存储,列作为行的一个个片断,列式存储是以一种新的列格式.每个列被存储为一个单独的结构.列存储区不取代缓冲区缓存,但作为一个补充,使数据可以存储在内存中的行和列格式.要使用列

oracle 12c 列式存储 ( In Memory 理论)

随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以查询为主的OLAP应用.in memory组件可以和其他数据库组件功能使用,并不需要用户单独开发或者修改应用程序,就可以非常方便的实现基于实时数据库分析的转变.本文会介绍in memory组件的一些相关知识,包含了以下的内容: -列式存储的基本知识 -访问in memory area中的数据 -In

Infobright列式存储数据库

Infobright 是一个非常强大的列式存储数据库,基于MySQL的高效数据仓库. 之所以使用数据仓库,是因为目前MySQL数据库中的数据增长很快,定期会对一些历史记录表进行清除,但后期的统计分析还会用到这些历史数据,随着数据量的增大,查询也越来越慢,而数据库仓库特有的存储格式能够减小磁盘空间内的占用,同时列式的特点使得查询速度大为改观.选择Infobright是因为它锁支持的数据类型更多些,更接近于mysql,更节省磁盘空间,毕竟主要的统计查询还不是在数据仓库上,偶尔的查询一下速度倒不是要求

列式存储数据库

关系型数据库系统以二维表的形式呈现数据,比如下面的员工表 RowId EmpId Lastname Firstname Salary 001 10 Smith Joe 40000 002 12 Jones Mary 50000 003 11 Johnson Cathy 44000 004 22 Jones Bob 55000 上面的格式仅仅存在于理论和逻辑中,事实上存储设备要求数据序列化为某种形式. 我们知道对于硬盘来说,最昂贵的操作是查找.为了提高最终性能,所需要的相关数据应该以某种方式去存储

[Hive]-列式存储篇

1. ORC是什么 ORC,全称 Optimized Row Columnar.是Hadoop生态圈的列式存储概念,最早由Hive提出.\ 在Hive的ORC,首先依然是根据行组分割整个表,但是在每个行组中,按列存储.ORC文件是自描述的,它的元数据使用Protocol Buffers进行序列化,并尽可能的进行压缩 2.ORC的好处 列式存储有很高的压缩比.(因为同列数据,数据格式,重复率等相同几率很高,并且可以针对列相同的数据类型,采用更好的压缩方式) 优化查询效率(可以只查询某些需要的列而不

数据库为什么会分为“行式存储”和“列式存储”呢?

我们知道 当今的数据处理大致可分为两大类 联机事务处理 OLTP (on-line transaction processing) 以及联机分析处理 OLAP (On-Line Analytical Processing) OLTP 是传统关系型数据库的主要应用 用来执行一些基本的.日常的事务处理 比如数据库记录的增.删.改.查等等 而 OLAP 则是分布式数据库的主要应用 它对实时性要求不高,但处理的数据量大 通常应用于复杂的动态报表系统上 OLTP与OLAP的主要区别 OLTP与OLAP 在

HBase 是列式存储数据库吗

在介绍 HBase 是不是列式存储数据库之前,我们先来了解一下什么是行式数据库和列式数据库. 行式数据库和列式数据库 在维基百科里面,对行式数据库和列式数据库的定义为:列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理(OLAP)和即时查询.相对应的是行式数据库,数据以行相关的存储体系架构进行空间分配,主要适合于小批量的数据处理,常用于联机事务型数据处理(OLTP). 比如我们有以下的表格: 那么行式数据库和列式数据库存储模型分别如上面的左图和右图.可以看到,行式数据一行的

列式存储数据库-kudu

一.kudu概念 Apache Kudu是由Cloudera开源的存储引擎,可以同时提供低延迟的随机读写和高效的数据分析能力.Kudu支持水平扩展,使用Raft协议进行一致性保证,并且与Cloudera Impala和Apache Spark等当前流行的大数据查询和分析工具结合紧密. 这是一个为块数据的快分析而生的存储架构 二.kudu架构Master:master节点负责整个集群的元数据管理和服务协调.它承担着以下功能:作为catalog manager,master节点管理着集群中所有tab

你应该知道一些其他存储——列式存储

导读:在讲<Apache Druid 底层存储设计>时就说过要讲一讲列式存储.现在来了,通过本文你可以了解到行存储模式.列存储模式.它们的优缺点以及列存储模式的优化等知识. 今日格言:不要局限于单向思维,多对比了解更多不同维度的东西. 从数据存储讲起 我们最先接触的数据库系统,大部分都是行存储系统.大学的时候学数据库,老师让我们将数据库想象成一张表格,每条数据记录就是一行数据,每行数据包含若干列.所以我们对大部分数据存储的思维也就是一个复杂一点的表格管理系统.我们在一行一行地写入数据,然后按查