为更好说明,举一个内存数据库RapidsDB的例子。列存储索引利用列存储技术高效地从磁盘存储中检索大量值(建议使用闪存或固态硬盘)。因为列存储索引通常提供大量压缩数据,这是由磁盘支持的,不像RapidsDB中的其他类型的索引那样要求所有数据都必须存放于内存中,所以对于时刻处理PB级数据量的分析型工作的负载优化非常有用。
列存索引是将列存表中一列或多列定义为键列。数据按键列顺序存储以提高检索性能。由此引入行段概念,行段是列存索引中存储在一起的一组行,每个行都由列段组成。RapidsDB存储每行的元数据,其中包括给定段的总行数,以及跟踪哪些行已被删除的位掩码。而且RapidsDB会在列存索引键列上的一组行段进行排序。这意味在已排序的行段组中,不会有行段与构成列存索引键的列的值范围重叠。在对表运行 INSERT、LOAD 或 UPDATE 查询后创建更多段时,会形成新的段组。
在以下四种情况下,列存索引对RapidsDB的列存表起明显的加速效果:(1)查询仅扫描索引指定的列段,如测试表Products的索引为Qty,查询 SELECT SUM(Qty) FROM Products;则只需要扫描Qty列段,并且利用列段中的值做SUM计算。(2)查询只引用行段中的列存索引元数据。最简单例子:SELECT COUNT(*) FROM Products;使用MAX或者MIN也可以达到相同的效果。(3)查询过滤条件使用列存索引元数据的最小值和最大值,判断是否跳过扫描对应的行段。优化效率取决于实际可以跳过的段的百分比。(4)在表关联时,列存索引被用在关联条件时,只需要简单扫描行段的值,就可以完成关联条件的过滤,同样的跳过了IO磁盘扫描的开销,提升性能。
列存索引是将列存表中一列或多列定义为键列。数据按键列顺序存储以提高检索性能。由此引入行段概念,行段是列存索引中存储在一起的一组行,每个行都由列段组成。RapidsDB存储每行的元数据,其中包括给定段的总行数,以及跟踪哪些行已被删除的位掩码。而且RapidsDB会在列存索引键列上的一组行段进行排序。这意味在已排序的行段组中,不会有行段与构成列存索引键的列的值范围重叠。在对表运行 INSERT、LOAD 或 UPDATE 查询后创建更多段时,会形成新的段组。
在以下四种情况下,列存索引对RapidsDB的列存表起明显的加速效果:(1)查询仅扫描索引指定的列段,如测试表Products的索引为Qty,查询 SELECT SUM(Qty) FROM Products;则只需要扫描Qty列段,并且利用列段中的值做SUM计算。(2)查询只引用行段中的列存索引元数据。最简单例子:SELECT COUNT(*) FROM Products;使用MAX或者MIN也可以达到相同的效果。(3)查询过滤条件使用列存索引元数据的最小值和最大值,判断是否跳过扫描对应的行段。优化效率取决于实际可以跳过的段的百分比。(4)在表关联时,列存索引被用在关联条件时,只需要简单扫描行段的值,就可以完成关联条件的过滤,同样的跳过了IO磁盘扫描的开销,提升性能。