15.ClickHouse之列式存储| 青训营笔记

94 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

列式存储概念

  • 行式存储是指一行中的数据在存储介质中连续存储。 image.png
  • 列式存储是指一列中的数据在存储介质中连续存储。 image.png
  • 简单的说,可以把列式数据库认为是每一列都是一个表,这个表只有一列,如果只在该列进行条件查询,速度就很快。

列存储的优点:

  • 数据压缩
    • 数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势
    • 相同类型压缩效率更高
    • 排序之后压缩效率更高
    • 可以针对不同类型使用不同的压缩算法
  • 数据选择
    • 可以选择特定的列做计算而不是读所有列
    • 对聚合计算友好
  • 延迟物化
    • 延迟物化,尽可能推迟物化操作的发生
      • 物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join
    • 缓存友好
    • CPU/内存带宽友好
    • 可以利用到执行计划和算子的优化,例如filter
    • 保留直接在压缩列做计算的机会
  • 向量化
    • SIMD
      • SIMD(single instruction multiple data) ,对于现代多核CPU,其都有能力用一条指令执行多条数据。
      • SIMD程序使用的指令集有SSE和AVX系列,AVX有AVX-256和AVX-512,SSE提供128-bits的寄存器,AVX-256提供256-bits,AVX-512提供512bits的寄存器。
      • 如果这时候CPU也可以并行的计算我们写的代码,那么理论上我们的处理速度就会是之前代码的100倍,SIMD指令就可以完成这样的工作,用SIMD指令完成的代码设计和执行的逻辑就叫做向量化
    • 数据格式要求
      • 需要处理多个数据,因此数据需要是连续内存
      • 需要明确数据类型
    • 执行模型
      • 数据需要按批读取
      • 函数的调用需要明确数据类型

列存数据库适合设计出这样的执行模型,从而使用向量化技术:

  • 按列读取
  • 每种列类型定义数据读写逻辑
  • 函数按列类型处理

行存VS列存

image.png

参考

​​‍​⁢⁣⁣‍​‌‍​‬​‬⁢​⁣⁤⁡⁣⁡⁣⁢​⁢​‬‌​​⁤‬⁤​⁡⁣​​‌⁢‍第五届青训营 ClickHouse-你没见过的列存储.pptx - 飞书云文档 (feishu.cn)