行存储

列存储

优点

写入效率高,保证数据完整性

读取效率高,没有冗余

缺点

数据有冗余现象,计算速度慢

写入次数多,速度慢,消耗cpu

使用场景

关注整张表内容,或者需要经常更新数据、需要经常读取整行数据、不需要聚集运算,或者快速查询需求、数据表本身数据行并不多

经常关注一张表某几列而非整表数据的时候、基于一列或比较少的列计算的时候、数据表拥有非常多的列的时候、数据表有非常多行数据并且需要聚集运算的时候、数据表列里有非常多的重复数据,有利于高度压缩

行存储的写入是一次性完成,消耗的时间比列存储少, 并且能够保证数据的完整性,缺点是数据读取过程中会产生冗余数据;
如果只有少量数据,此影响可以忽略,数量大可能会影响到数据的处理效率;
列存储在写入效率、保证数据完整性上都不如行存储,它的优势是在读取过程不会产生冗余数据,这对数据完整性要求不高的大数据处理领域,比如互联网,犹为重要。

列存查询速率优于行存原理分析:

传统的存储数据的方式是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行的所有列的数据。

列存储索引适合于数据仓库中,主要执行大容量数据加载和只读查询,与传统面向行的存储方式相比,使用列存储索引存储可最多提高 10 倍查询性能 ,与使用非压缩数据大小相比,可提供多达 7 倍数据压缩率 。列存储索引使用用“批处理执行模式”的模式,这与行存储使用的逐行数据读取模式对比,性能大幅提升。

列存储索引主要在下面三个特性上提升查询的性能:

  • 行存储使用逐行处理模式,每次只处理一行数据;而列存储索引使用批处理模式,每次处理一批数据行。
  • 行存储是逐行存储(Row Store),每一个Page存储多行数据,而列存储(Column Store)把数据表中的每一列单独存储在Page集合中,这意味着,Page集合中存储的是某一列的数据,而不是一行中所有列的数据。在读取数据时,行存储把一行的所有列都加载到内存,即使有些列根本不会用到;而列存储只把需要的列加载到内存中,不需要的列不会被加载到内存中。
  • 列存储索引自动对数据进行压缩处理,由于同一行的数据具有很高的相似性,压缩率很高,数据读取更快速。

一般情况下,数据仓库的查询语句只会查询少数几个列的数据,其他列的数据不需要加载到内存中,这就使得列存储特别适合用于数据仓库中。