作者介绍
azurezhao(赵阳),腾讯云数据库高级工程师,具备多年存储经验,包括文件存储、kv存储、数据库存储等。目前在腾讯专注于CDW PG数据库内核相关的研发。
向量化计算层缓存(VectorTableSlot Cache, 下面简称VTS-Cache)。和传统的OLTP数据按行聚簇方式不同,在OLAP场景下,查询大多数是对某些列进行的,数据存储按照列式存储,查询运算时的数据也是按照列式存储,如下图所示。当前每次执行都需要去存储层读取数据,会有开销,所以考虑引入一层缓存层。但是在OLAP场景下,因为数据很大,如果使用一个类似OLTP下的BufferPool的磁盘-内存映射缓存,会因为频繁的换入换出导致缓存几乎不生效。所以考虑引入一层执行层的缓存,缓存的粒度是如下的ColumnVector,因为缓存的数据会带Qualification,所以能比较大的过滤一些数据,从而减少数据cache的量,并且支持DML,不影响数据的一致性,支持缓存的LRU淘汰机制,目前只对Estore支持,后续会考虑支持Heap表,从而为HTAP提供统一的缓存层。
缓存语句,通过配置项和规则(内存大小、语句条件是否含有变量等等)将满足要求的语句和结果缓存在query_cache中,并且使用LRU规则做内存替换。
在高版本MySQL中已经去除了这个特性。
通过内存块和物理文件按照block大小做映射,数据访问如果没有在内存中,则在磁盘中读取到内存中,再返回给上层。
本章将介绍VTS-Cache生成原理和细节。如下图所示
本章将介绍VTS-Cache使用原理和细节。如下图所示
图解如下:
create table student(id int,varchar name,int age) with (orientation = column);select id, age from student where age > 15;
select age from student where age > 15;
select age from student where age > 16;
VTS-Cache的内存回收按照朴素的LRU算法进行回收,需要注意的是,缓存块需要按需被pin住,直到使用结束,并且考虑各种异常场景需要释放引用计数,否则会有缓存泄露。
此外,VTS-Cache和普通的缓存不同,它是由一条query产生多个有关联的cache,所以回收内存也需要按照query级别来回收关联所有cache块。
对于一个典型的HTAP应用,我们会将普通heap表里面按行存储的数据存储到按列聚簇的内存数据结构VectorTableSlot中,然后按照向量化的方式做运算,加速运算过程,也就是所谓的“行转列”。
对于运算层来说,拿到的是VectorTableSlot这个数据结构,如果我们对于行存的查询也构建一套VTS-Cache,就能为OLTP和OLAP提供统一的运算层缓存,进而加速HTAP场景运算。
VTS-Cache是一个OLAP场景下向量化执行缓存,考虑OLAP场景下处理的数据量比较大,直接用传统的内存-文件映射的缓存难以解决缓存的低效命中。所以考虑使用执行层的缓存,能够过滤大多数的数据,并且比类似MySQL的语句缓存更加灵活,能够方便支持Heap表,为OLAP和OLTP提供统一的HTAP执行层缓存。
推荐阅读
关注腾讯云大数据公众号
邀您探索数据的无限可能
点击“阅读原文”,了解相关产品最新动态
↓↓↓