面向行的存储或“行存储”是关系型数据库使用的最常见的数据库存储类型。顾名思义,行存储将每一行视为一个单元,并将给定行的所有字段一起存储在同一物理位置中。这使得行存储非常适合事务型工作负载,在这种情况下,数据库的选择、插入、更新和删除单个行的操作,通常会引用大多数或所有的列。
面向列的存储或“列存储”将每一列视为一个单元,并将每列的数据段一起存储在同一物理位置中,这个手段实现了两个重要的功能:一个功能是可以单独扫描每一列。本质上,能够只扫描查询所需的列,在扫描期间具有良好的缓存局部性。另一个功能是列存储非常适合进行压缩。例如,复和相似的值可以很容易地压缩在一起。同时,基于列式存储格式,可以使用基于硬件SIMD指令集的向量化执行模式(Vector-at-a-time)提高数据访问的效率。
比如说RapidsDB,它支持使用全内存的行式存储和基于内存的列式存储来存储和处理数据。基于全内存的行式存储为事务型工作负载提供了最佳的实时性能。基于内存的列式存储最适合跨大型历史数据集的分析工作负载。列式表的数据写入过程首先要在内存通过列存储索引对数据进行计算,将各数据块的元数据保存于内存中,同时将压缩备份的数据存放于磁盘中。事务、缓存、执行计划等均在内存中计算、存储。磁盘中大部分操作均为写入操作,读取操作大部分在内存中完成,更加保障了查询效率的提升。
面向列的存储或“列存储”将每一列视为一个单元,并将每列的数据段一起存储在同一物理位置中,这个手段实现了两个重要的功能:一个功能是可以单独扫描每一列。本质上,能够只扫描查询所需的列,在扫描期间具有良好的缓存局部性。另一个功能是列存储非常适合进行压缩。例如,复和相似的值可以很容易地压缩在一起。同时,基于列式存储格式,可以使用基于硬件SIMD指令集的向量化执行模式(Vector-at-a-time)提高数据访问的效率。
比如说RapidsDB,它支持使用全内存的行式存储和基于内存的列式存储来存储和处理数据。基于全内存的行式存储为事务型工作负载提供了最佳的实时性能。基于内存的列式存储最适合跨大型历史数据集的分析工作负载。列式表的数据写入过程首先要在内存通过列存储索引对数据进行计算,将各数据块的元数据保存于内存中,同时将压缩备份的数据存放于磁盘中。事务、缓存、执行计划等均在内存中计算、存储。磁盘中大部分操作均为写入操作,读取操作大部分在内存中完成,更加保障了查询效率的提升。