聊一聊数据库的行存与列存

article/2025/10/24 20:30:29

目录

存储方式比较

优缺点比较

行存与列存实验

选择建议

注意事项


好多人最开始学习数据库的时候,是关系数据库,数据以表格形式存储,一行表示一条记录。其实这种就是典型的行存储(Row-based store),将表按行存储到磁盘分区上。
而一些数据库还支持列存储(Column-based store),它将表按列存储到磁盘分区上。

存储方式比较

这两者的差异如下图:

从图上可以看出,行存的时候,一行记录的属性值存储在临近的空间,然后接着是下一条记录的属性值。
而列存的时候,单个属性所有的值存储在临近的的空间,即一列的所有数据连续存储的,每个属性有不同的空间。
这里,大家可以自行思考一下这两种那种更适合查询,那种更适合修改?
在数据写入上的对比:
1)行存储的写入是一次完成。写入建立在操作系统的文件系统上,可以保证写入过程的成功或者失败,数据的完整性因此可以确定。
2)列存储由于需要把一行记录拆分成单列保存,写入次数明显比行存储多,再加上磁头需要在盘片上移动和定位花费的时间,实际时间消耗会更大。所以,行存储在写入上占有很大的优势。
3)还有数据修改,这实际也是一次写入过程。所以,数据修改也是以行存储占优。
在数据读取上的对比:
1)行存储通常将一行数据完全取出,如果只需要其中几列数据的情况,就会存在冗余列,出于缩短处理时间的考量,消除冗余列的过程通常是在内存中进行的。
2)列存储每次读取的数据是集合的一段或者全部,不存在冗余性问题,查找内容连续存储,特别适合投影。
3) 两种存储的数据分布。由于列存储的每一列数据类型是同质的,不存在二义性问题。比如说某列数据类型为整型(int),那么它的数据集合一定是整型数据。这种情况使数据解析变得十分容易。相比之下,行存储则要复杂得多,因为在一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间。所以,列存储的解析过程更有利于分析大数据。
4)从数据的压缩以及更性能的读取来对比。同一列的数据,数据类型一致,列存的模式下就适合数据压缩,不同的列可以采用不同的压缩算法,压缩存储就会带来IO性能的提升。

优缺点比较

表的存储类型是表定义设计的第一步,客户业务类型是决定表的存储类型的主要因素。行、列存储模型各有优劣,建议根据实际情况选择。

行、列存优缺点及适用场景比较见下表:

行存

列存

优点

数据被保存在一起。INSERT/UPDATE容易。

  1. 查询时只有涉及到的列会被读取。
  2. 投影(Projection)很高效。
  3. 任何列都能作为索引。

缺点

选择(Selection)时即使只涉及某几列,所有数据也都会被读取。

  1. 选择完成时,被选择的列要重新组装。
  2. INSERT/UPDATE比较麻烦。
  3. 点查询不适合。

适用场景

  1. 点查询(返回记录少,基于索引的简单查询)。
  2. 增、删、改操作较多的场景。
  1. 统计分析类查询 (OLAP,比如数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少,关联、分组操作较多)。
  2. 即时查询(查询条件不确定,行存表扫描难以使用索引)。

行存与列存实验

openGauss支持行列混合存储,可以在建表的时候指定存储方式。下面我们进行一下实验。
实验环境:华为云服务器+openGauss企业版3.0.0 + openEuler20.03
创建行存表custom1 和列存表custom2 ,插入50万条记录。

openGauss=# create table custom1 (id integer,name varchar2(20)); 
CREATE TABLE 
openGauss=# create table custom2 (id integer,name varchar2(20)) with (orientation = column); 
CREATE TABLE 
openGauss=# insert into custom1 select n,'testtt'||n from generate_series(1,500000) n; 
INSERT 0 500000 
openGauss=# insert into custom2 select * from custom1; 
INSERT 0 500000

我们看下两个表的存储空间,比较Size列,可以看出列存表比行存表占用存储空间小的非常多,差不多是行存表空间的1/7。

openGauss=# \d+ List of relations Schema |    Name    | Type  | Owner |    Size    |               Storage                | Description 
--------+------------+-------+-------+------------+--------------------------------------+------------- public | custom1    | table | omm   | 24 MB      | {orientation=row,compression=no}     | public | custom2    | table | omm   | 3104 kB    | {orientation=column,compression=low} | 

比较下插入一条新记录的时间,列存表要稍微慢一点。

openGauss=# explain analyze insert into custom1 values(1,'zhang3'); QUERY PLAN 
----------------------------------------------------------------------------------------------- [Bypass] Insert on custom1  (cost=0.00..0.01 rows=1 width=0) (actual time=0.059..0.060 rows=1 loops=1) ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.001 rows=1 loops=1) Total runtime: 0.135 ms 
(4 rows) openGauss=# explain analyze insert into custom2 values(1,'zhang3'); QUERY PLAN 
----------------------------------------------------------------------------------------------- Insert on custom2  (cost=0.00..0.01 rows=1 width=0) (actual time=0.119..0.120 rows=1 loops=1) ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.002 rows=1 loops=1) Total runtime: 0.207 ms 
(3 rows) 

最后删除测试表。

openGauss=# drop table custom1; 
DROP TABLE 
openGauss=#drop table custom2; 
DROP TABLE

感兴趣的同学可以自己测试更多的的场景,比如创建大宽表、update表等场景测试下。

选择建议

  • 更新频繁程度:数据如果频繁更新,选择行存表。
  • 插入频繁程度:频繁的少量插入,选择行存表。一次插入大批量数据,选择列存表。
  • 表的列数:一般情况下,如果表的字段比较多即列数多(大宽表),查询中涉及到的列不多的情况下,适合列存储。如果表的字段个数比较少,查询大部分字段,那么选择行存储比较好。
  • 查询的列数:如果每次查询时,只涉及了表的少数(<50%总列数)几个列,选择列存表。(不要问剩下的列干啥用,甲方说有用就是有用。)
  • 压缩率:列存表比行存表压缩率高。但高压缩率会消耗更多的CPU资源。

注意事项

列存由于特殊的存储方式,使用时约束比较多。比如,列存表不支持数组、不支持生成列、不支持创建全局临时表、不支持外键,支持的数据类型也会比行存要少。使用时需要查看对应的数据库文档。


http://chatgpt.dhexx.cn/article/9ItVhUWD.shtml

相关文章

聊一聊 AS 的一些好用的功能

聊一聊 AS 的一些好用的功能 文章开始前先墨迹几句&#xff0c;好久没写文章了&#xff0c;这段时间公司确实挺忙&#xff0c;也没抽出时间&#xff0c;上一篇文章还是三月初写的&#xff0c;距今已经两个多月啦&#xff0c;不能再这样下去了&#xff0c;虽然我不能像一些大佬…

聊一聊罗振宇

小灰是得到平台的重度用户&#xff0c;也是罗振宇的粉丝。 罗振宇&#xff0c;人称“罗胖子”&#xff0c;非常有趣的是&#xff0c;人们常常把另一个姓罗的胖子和他混为一谈。 今天&#xff0c;我们就来聊一聊他。 罗振宇是个特别复杂的人。 很多人认识罗振宇&#xff0c;是从…

聊一聊我的2020

回顾2020 &#xff08;接下来是一大段唠叨&#xff0c;可以直接到文末&#xff0c;有小安利和经验总结&#xff09; 还有几天2020年就结束并迎来新的一年。这一年中总是能听到有人在感慨2020是不平凡的一年。仔细想想&#xff0c;确实如此&#xff0c;至少对我来说是这样的。 作…

聊一聊 gRPC 中的拦截器

今天我们继续 gRPC 系列。 前面松哥跟大家聊了 gRPC 的简单案例&#xff0c;也说了四种不同的通信模式&#xff0c;感兴趣的小伙伴可以戳这里&#xff1a; 一个简单的案例入门 gRPC 聊一聊 gRPC 的四种通信模式 今天我们来继续聊一聊 gRPC 中的拦截器。 有请求的发送、处理&…

聊一聊微博新知博主这件事,看看赚钱方式有哪些?

从今天开始&#xff0c;准备将我付费星球内的精华文章&#xff0c;在每周六和周日以付费文章的方式在公众号分享给大家&#xff0c;如果你不想加入我的星球&#xff0c;还想看的话&#xff0c;可以在这里付费看。当然&#xff0c;加入星球会更划算&#xff0c;因为星球内内容更…

【QGIS入门实战精品教程】2.1:初识QGIS软件

从今天开始&#xff0c;我们一起来学习一款免费开源、对机器要求低、功能强大的GIS软件&#xff1a;QGIS &#xff01; 一、QGIS简介 QGIS&#xff08;原称Quantum GIS&#xff09;是一个自由软件的桌面GIS软件。它提供数据的显示、编辑和分析功能。 QGIS是一个用户界面友好的…

QGIS教程01:为什么要用QGIS?

从去年开始抛弃ArcGIS转用QGIS以来&#xff0c;发现QGIS越来越好用&#xff0c;功能也相当强大。而且我发现身边好多朋友也在开始使用QGIS&#xff0c;但目前国内这方面的学习资料还比较少&#xff0c;国外的原版资料又相对比较啰嗦&#xff0c;所以我和几位GISer入门知识星球的…

qgis教程

qgis教程 一、导入点云文件 1、新建图层 2、视图-》创建3d视图 3、添加标注工具&#xff0c;创建 shape

【QGIS入门实战精品教程】3.4:QGIS创建、连接、打包GeoPackage数据库及数据入库案例详解

GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。在QGIS中可以很方便的实现GeoPackage的创建与连接等操作。 文章目录 一、QGIS创建GeoPackage1. 创建数据库2. 数据入库二、矢量数据打包为GeoPackage1. 加载shp文件2. 使用QGIS打包图…

【QGIS入门实战精品教程】3.3:QGIS如何打开ArcGIS创建的文件数据库(GDB)?

在行业应用中,GIS地理空间数据往往存储在ESRI ArcGIS的文件地理数据库(File GeodataBase),因此,ArcGIS与QGIS的数据交互、共享就显得非常重要。QGIS3可以直接打开File GDB数据,并对数据进行显示、查看、处理等操作。具体的步骤如下: 相关阅读:【QGIS入门实战精品教程】3…

【QGIS入门实战精品教程】1.2:QGIS与ArcGIS的区别和联系

「刘一哥GIS」系列专栏《QGIS入门实战精品教程(配套案例数据)》目录 以下是GISGeography官方给出的两者之间的27点比较(译): 官方网址:https://gisgeography.com/qgis-arcgis-differences/ 1.QGIS容纳更多的数据格式 ArcGIS没有支持所有的数据格式,毫无疑问,QGIS在处…

Qgis教程1:添加在线地图

自学Qgis小结1 一、作为应届生小白&#xff0c;进入公司得知要学习Qgis&#xff0c;可谓是对此一点也不了解&#xff0c;从来没接触过Qgis的我也不得不沉下心来去学习&#xff0c;取取经&#xff0c;下面是我学习Qgis过程的一点理解&#xff0c;希望对广大网友有所帮助&#x…

【QGIS入门实战精品教程】5.2:QGIS自定义坐标系案例教程

我国全国版图常用的投影为双标准纬线圆锥投影,如等积Albers投影或者等角Lambert投影,所使用的地理坐标参照系则依据数据生产时间而有所不同,如早期的北京54坐标系和西安80坐标系,以及近年来所普遍采用的国家2000大地坐标系。本文以全国四百万基础植被数据所采用的Albers投影…

【QGIS入门实战精品教程】14.1:QGIS如何加载各种在线地图?

文章目录 一、XYZ Tiles连接方式二、插件添加三、WMS/WMTS/OWS连接方式一、XYZ Tiles连接方式 1. 加载OpenStreetMap QGIS默认可以加载OpenStreetMap地图。在左侧点击XYZ Tiles,默认下面有个OpenStreetMap选项,双击打右侧会显示地图,如下图所示: 在OpenStreetMap上右键→…

【QGIS入门实战精品教程】2.2:QGIS软件的下载与安装(Windows)

文章目录 一、QGIS下载二、QGIS安装​一、QGIS下载 QGIS软件官网下载地址:https://www.qgis.org/en/site/ 进入官网之后,点击【Download Now】进入下载页面: 选择对应的版本进行下载: 开始下载:

QGIS基础教程 (入门级)——高程、光谱数据设置伪彩色

QGIS基础教程&#xff08;一&#xff09; 本教程内容相对基础&#xff0c;面向从未使用过QGIS或相似GIS软件人群 数据分享&#xff0c;百度网盘链接: https://pan.baidu.com/s/1Qi-o2TNoxPIdX0bWgqZzcQ?pwdathz 提取码: athz 第二节 遥感影像基础操作——1. 高程数据设置彩色…

QGIS基础教程 (入门级)——下载安装、新建工程、加载数据

QGIS基础教程&#xff08;一&#xff09; 本教程内容相对基础&#xff0c;面向从未使用过QGIS或相似GIS软件人群 第一节 QGIS下载安装&#xff0c;新建工程&#xff0c;加载数据 1. 下载及安装 官网下载&#xff1a;QGIS下载网址 注意&#xff1a;下载长期版&#xff0c;比…