列存是常见的数据存储技术,在许多场景下也确实很有效,因而也被不少数据仓库类产品采用,在业内列存也常常就意味着高性能。
可是,列存真有这么好吗?搜索一下,容易找到的列存缺点一般是针对数据修改的,而对于只读的分析计算任务,却很少能见到较详细的讨论。我们在这里来研究一下这个问题。
对内存计算意义不大
列存的原理很简单:由于磁盘不适合跳动式读取,采用行式存储时在读取数据时会扫描所有列,而一次运算可能只涉及很少的列,这样就会多读很多用不上的数据。采用列存则只需要读取需要用到的列,数据访问量大概率会大幅减少,而大数据计算中磁盘扫描时间的占比很大,减少访问量就能节约大量时间。另外,同一列数据相同值情况较多,采用列存更容易做合并压缩,从而进一步减少数据存储量,提高性能。
从原理可以看出,列存能提高性能主要是因为减少了磁盘访问量,但对于计算量减少并没有帮助。如果数据已经被加载进内存,再采用列存就没多大意义了。普通结构化数据运算都是以行为单位的,在内存中使用列存反而会加大构造完整记录的复杂度,降低性能。所以,除了专业的向量式运算(数据挖掘中常用,运算本身就是以列为单位的)外,类似关系数据库型的内存运算(包括内存数据库)并不合适采用列式存储。