行存与列存——数据表的存储方式

news/2024/7/9 20:21:14 标签: 数据库, postgresql

以下是一个简单的数据表:

idnameagesalary
20220001Jack184500
20220002Bob206000
20220003Michael255300
20220004Michele224800
20220005Mike186500

采用按行存储,数据表在磁盘上的存储形式:

tuple1: | 20220001 | Jack | 18 | 4500 |

tuple2: | 20220002 | Bob | 20 | 6000 |

tuple3: | 20220003 | Michael | 25 | 5300 |

tuple4: | 20220004 | Michele | 22 | 4800 |

tuple5: | 20220005 | Mike | 18 | 6500 |

采用按列存储,数据表在磁盘上的存储形式:

tuple1: | 20220001 | 20220002 | 20220003 | 20220004 | 20220005 |

tuple2: | Jack | Bob | Michael | Michele | Mike |

tuple3: | 18 | 20 | 25 | 22 | 18 |

tuple4: | 4500 | 6000 | 5300 | 4800 | 6500 |

可以看到,行存和列存的区别在于一个tuple内存储的是行数据还是列数据。对于按列存储,由于每一列的数据相似度较高,对数据进行压缩时压缩比会很大。对于不同的应用场景,这两种存储方式各有优缺点。

场景一:对id进行等值查找并显示整条记录:select * from table where id = ???;如采用按行存储,只需要通过索引或者直接找到id符合条件的行,然后读取该行的tuple即可。如采用按列存储,由于需要获取到每一个字段的值,在查找到id符合条件的行号后,需要读取剩下的每一个tuple,以获取相应字段的值。这种场景下,显然按行存储性能占优。

场景二:计算某一个字段的和或平均值:select AVG(salary) from table;如采用按行存储,需要读取表中的所有tuple,获取每一个tuple的salary字段,然后进行求平均值。如采用按列存储,则只需要读取存储salary的一个tuple,即可求平均值。这种场景下,显然按列存储性能占优。

场景三:插入、修改、删除某条记录。如采用按行存储,只需要插入或删除一个tuple即可。如采用按列存储,则需要对每一个tuple进行修改。显然按行存储性能占优。

综上,对于OLTP交易类业务,一般复杂计算较少而存取较多,要求读写时延小,按行存储优势较大。对于OLAP分析类业务,一般有大量的聚合、连接、统计等计算操作,和仅仅涉及到一个宽表中个别列的复杂查询,而数据修改、随机查询等操作较少,按列存储优势较大。


http://www.niftyadmin.cn/n/1842721.html

相关文章

无线部署模式

WLAN的数据转发工作原理 CSMA/CA:载波监听多路访问/冲突避免(因为无线工作在半双工模式下,同一个区域内同一时刻,只能一个设备发包)避免同频信号重叠导致无法调解 CSMA/CD:载波监听多路访问/冲突检测(以太网&#xff0…

PostgreSQL表和元组的组织方式

上面讲过PostgreSQL的页大小为8K,这意味着堆文件大小最小为8K,且一定为8K的整数倍。对于PostgreSQL,单个堆文件的最大大小限制为1G,超过1G的表会被分成多个堆文件存储。 每一个8K的页面的结构如下图: 这里每一个tupl…

PostgreSQL VFD——虚拟文件描述符

在操作系统中,每当一个进程打开一个文件,系统就会为该文件分配一个唯一的文件描述符,在Linux系统中是一个int类型的值。每个操作系统都会对一个进程能打开的文件数加以限制,用ulimit -n命令可以查看进程能打开的最大文件数。对于一…

Linux bash学习总结

文章目录Bash shellBash shell 的功能命令记录能力 (history)命令与档案补全功能:([tab] 按键的好处)命令删名设定功能(alias)工作控制、前景背景控制(job control, foreground, background)程序化脚本(shell scripts)通配符(Wildcard)Bash shell的内建命令&#xf…

openGauss源码解析——列存压缩算法

在openGauss数据库中,相对于行存以页为单元进行压缩,列存以CU为单元具有天然的压缩优势。 在openGauss中有三种压缩级别:LOW, MIDDLE, HIGH。指定的压缩等级越高,则数据的压缩率越高。除此之外还可以选择不开启压缩。 typedef e…

openGauss列存数据压缩实验

对于时序场景,float和timestamp类型占比较大,需要重点关注,较高的压缩率可以降低磁盘空间的使用。 openGauss中,对于float使用Delta2算法,对于float使用XOR算法,推测参考了facebook关于时序数据库的论文&a…

解决:ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

目录问题解决问题 在oracle数据库中执行insert操作时,遇到下面的错误信息: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 00054. 00000 - “resource busy and acquire with NOWAIT specified or timeout expired”…

PostgreSQL插入大量数据:pg_testgen插件

PostgreSQL test generator 在进行数据库开发、测试时,新建表之后,时常想自己插入数据,但十分麻烦。 pg_testgen插件可以产生大量随机数据,方便进行数据库开发测试。 插件地址:pg_testgen 安装方法: c…