聊聊OceanBase的向量化过滤为帮助客户解决HTAP 混合负载下数据查询效率难的问题,OceanBase 引入向量化技术,并完全自主设计了向量化查询引擎,极大地提高了 CPU 单核处理性能,号称实现了HTAP 场景下复杂分析查询性能的 10 倍提升。我们来看下它是怎么实现过滤的。以2个字节的整型值比较为例:
指令说明:_mm256_set1_epi16:将一个16位2字节的整型广播成一个向量。向量大小256位也就是16个2字节的整数并行。_mm256_loadu_si256:从内存中加载256位整型数据,无需对齐。_mm256_cmp_epi16_mask:比较2个值,比较操作符由第3个入参指定。返回值结果类型为__mmask16即2个字节16位。每一位表示比较结果值。过程说明:列值通过_mm256_loadu_si256加载,比较值通过_mm256_set1_epi16广播成一个向量。通过_mm256_cm聊聊OceanBase的向量化过滤
为帮助客户解决 HTAP 混合负载下数据查询效率难的问题,OceanBase 引入向量化技术,并完全自主设计了向量化查询引擎,极大地提高了 CPU 单核处理性能,号称实现了 HTAP 场景下复杂分析查询性能的 10 倍提升。我们来看下它是怎么实现过滤的。以2个字节的整型值比较为例:
图片
指令说明:
_mm256_set1_epi16:将一个16位2字节的整型广播成一个向量。向量大小256位也就是16个2字节的整数并行。
_mm256_loadu_si256:从内存中加载256位整型数据,无需对齐。
_mm256_cmp_epi16_mask:比较2个值,比较操作符由第3个入参指定。返回值结果类型为__mmask16即2个字节16位。每一位表示比较结果值。
过程说明:
列值通过_mm256_loadu_si256加载,比较值通过_mm256_set1_epi16广播成一个向量。通过_mm256_cmp_epi16_mask对上面2个值进行比较。一次比较16个值。结果值16位,每一位表示比较结果。
也就是OceanBase 采用 bitmap 方案描述数据过滤,即每个算子都有一个 Bitmap,filter 过滤掉的数据,通过 bitmap 标识删除。当数据的选择率很低时,可能会出现 bitmap 标识的数据过于稀疏,性能不佳的情况。一些数据库通过增加整理方法,使数据稠密排列来避免上述情况。但OceanBase的HTAP 场景下 SQL 执行往往会出现阻塞算子(Sort, Hash Join, Hash Group by)或 Transmit 跨机执行算子,而这些算子本身具备数据整理让稠密输出的特点, 额外的数据整理反而会出现不必要的开销。因此 OceanBase 向量化引擎没有提供单独的方法改变 bitmap 数据排列。
参考
https://zhuanlan.zhihu.com/p/544575114
https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.htmlp_epi16_mask对上面2个值进行比较。一次比较16个值。结果值16位,每一位表示比较结果。也就是OceanBase 采用 bitmap 方案描述数据过滤,即每个算子都有一个 Bitmap,filter 过滤掉的数据,通过 bitmap 标识删除。当数据的选择率很低时,可能会出现 bitmap 标识的数据过于稀疏,性能不佳的情况。一些数据库通过增加整理方法,使数据稠密排列来避免上述情况。但OceanBase的HTAP 场景下 SQL 执行往往会出现阻塞算子(Sort, Hash Join, Hash Group by)或 Transmit 跨机执行算子,而这些算子本身具备数据整理让稠密输出的特点, 额外的数据整理反而会出现不必要的开销。因此 OceanBase 向量化引擎没有提供单独的方法改变 bitmap 数据排列。
参考
https://zhuanlan.zhihu.com/p/544575114https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html