[ 后端与 Go语言 | 青训营笔记]

33 阅读2分钟

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

在SQL Server里,Page是数据存储的基本单位,而数据行是实际数据的存储单位,它们从Page Header之后就开始依次存储在Page上。这种按行在Page上存储记录的方式就是行存储。当数据是按单列而不是多行进行连续存储时,就是所谓的列存储。

列存储的优势:磁盘的每个Page仅仅存储来自单列的值,而不是整行的值。因此,压缩算法会更加高效,因为它们能够作用于同类型的数据。例如,假定我们有一张有3列数据的表,这3列从左往右依次是int、varchar和bool类型,并且该表有100条(行)记录。对于都是int类型的第一列数据,应用压缩算法是很容易的,同时压缩率也会很高。这也将表明,我们不必访问该表的所有列,仅需访问感兴趣的相关列的子集,这从另一方面来讲,可以减少磁盘的I/O、提升缓存利用率,因此,磁盘存储会被更加高效的利用,就像索引维护一样。

列式存储引擎的适用场景包括:

1、查询过程中,可针对各列的运算并发执行,最后在内存中聚合完整记录集,最大可能降低查询响应时间;

2、可在数据列中高效查找数据,查询过程中能够尽量减少无关IO,避免全表扫描;

3、因为各列独立存储,且数据类型已知,可以针对该列的数据类型、数据量大小等因素动态选择压缩算法,以提高物理存储利用率;如果某一行的某一列没有数据,那在列存储时,就可以不存储该列的值,这将比行式存储更节省空间。

当然,跟行数据库一样,列式存储也有不太适用的场景,主要包括:

1、数据需要频繁更新的交易场景

2、表中列属性较少的小量数据库场景

3、不适合做含有删除和更新的实时操作