这是我参与「第五届青训营」笔记创作活动的第17天。
列式存储的优点
数据压缩
- 数据压缩可以使读的数据量更少,在IO密集型计算中获得更大的性能优势。
- 相同类型压缩效率更高。
- 排序之后压缩效率更高。
- 可以针对不同类型使用不同的压缩算法。
数据选择
- 可以选择特定的列做计算而不是读所有列。
- 对聚合计算友好。
延迟物化
物化:将列数据转换为可以被计算或者输出的行数据或者内存数据结果的过程,物化后的数据通常可以用来做数据过滤,聚合计算,Join。
延迟物化:尽可能推迟物化操作的发生。
- 缓存友好。
- CPU/内存带宽友好。
- 可以利用到执行计划和算子的优化,例如filter。
- 保留直接在压缩列做计算的机会。
向量化
SIMD(single instruction multiple data),对于现代多核CPU,其都有能力用一条指令执行多条数据。
如果这时候CPU也可以并行的计算我们写的代码,那么理论上我们的处理速度就会是之前代码的100倍,SIMD指令就可以完成这样的工作,用SIMD指令完成的代码设计和执行的逻辑就叫做向量化。
行存VS列存
| . | 行存 | 列存 |
|---|---|---|
| 优点 | 数据被保存在一起。 | 查询时只有涉及到的列会被读取。 |
| . | INSERT/UPDATE容易。 | 投影(Projection)很高效。 |
| . | . | 任何列都能作为索引。 |
| . | . | 便于做延迟物化和向量化计算。 |
| . | . | 压缩效率高,每一列可以使用不同的压缩算法。 |
| 缺点 | 选择(Selection)时即使只涉及某几列,所有数据也都会被读取。 | 选择完成时,被选择的列要重新组装。 |
| . | . | INSERT/UPDATE比较麻烦。 |
| . | . | 点查询不适合。 |
| 适用场景 | 点查询(返回记录少,基于索引的简单查询)。 | 统计分析类查询(OLAP,比如数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少,关联、分组操作较多)。 |
| . | 增、删、改操作较多的场景。 | 即时查询(查询条件不确定,行存表扫描难以使用索引)。 |