Column-Stores vs. Row-Stores: How Different Are They Really?

article/2025/11/5 8:23:19

Column-Stores vs. Row-Stores: How Different Are They Really?
论文阐述的就是行存与列存 两者之间到底有什么区别

Abstract

论文首先给出结论:列式存储(Column Stores)比行式存储(Row Stores)在性能上好过一个数量级。而这关键的原因就是:针对只读数据,列存的I/O效率远高于行存。因为他们只需要读取查询中涉及的一些列。
通常我们会想当然的认为对行存数据进行垂直分表、为每一列建索引,就可以在查询时,提高I/O效率,只查询部分列对应的数据,从而达到列存的速度。但是论文通过实验证明这个假设是错的。
论文首先用实验证明了行存相比与列存性能确实差了很多。然后论文分析了列存和行存之间的不同。包含两个方面:查询执行层面及存储层面。总结出列存主要存在以下几个优势:

  • 延迟物化(Late materialization)
  • 块遍历(Block iteration)
  • 列压缩(Column-specific compression techniques)
    同时如果行存想要达到列存这种性能优势,不仅要在查询执行层面进行优化,存储层面也需要进行优化。

Introduction

近些年(2008年)出现了很多列存系统,比如MonetDB,C-Store。这些作者说列存相比行存在读频繁的场景下性能可以提升一个数量级。但是这些列式系统的性能测试方式显然过于“传统”,仍然以行式存储下数据结构的设计思路来设计性能测试的方案。于是作者来了一个灵魂发问。

面向列的系统好于面向行的系统,是因为面向列的系统内在基础架构(个人觉得是列式的存储格式)导致的吗?传统的系统能否通过一些面向列的物理设计(通过一些手段来达到列式存储的效果)来达到面向列的系统的性能?

如何解答这个问题:
本文将通过 Star Schema Benchmark (SSBM) 典型的数仓测试拓扑结构,在面向行的系统中,模拟列存的设计范式,来解答上述疑惑。模拟列式范式的设计有:

  • 表结构垂直拆分
  • 全列索引+所有查询都走索引
  • 所有查询都做物化视图

从最终的实验得出,在行式存储上就算以column-oriented方式来设计数据的物理结构,面对分析型场景还是无法与列式存储抗衡。面对分析型场景,列式存储在本质上优于行式存储。
这同时又提出一个新问题:

到底是什么优化使列存在数仓场景下有比行存更好的性能

主要优化如下:

  • 延迟物化(Late materialization)
  • 块遍历(Block iteration)
  • 列压缩(Column-specific compression techniques)
  • 隐式连接(invisible join)

第二个问题解决之后,那么随之而来的是第三个问题:

知道是这些优化手段使列存性能好于行存,但是每个优化点到底能带来多少性能上的提升

本文主要就围绕这3个问题展开,主要关注第2、3个问题

列存优势

压缩 Compression

为什么压缩就能带来查询的高效呢?压缩首先带来的硬盘上存储空间的降低,但是硬盘又不值钱。它的真正意义在于:数据占用的硬盘空间越小,查询引擎花在IO上的时间就越少(不管是从硬盘里面把数据读入内存,还是从内存里面把数据读入CPU)。但是这并不意味着压缩比越高,查的就越快,因为数据读入内存之后还需要进行解压。所以我们需要再压缩比和解压速度之间做一个权衡。
同时甚至在一些情况下不需要解压也能对数据进行处理。比如对于采用Run-Length编码方式进行压缩的数据。
在这里插入图片描述

当你需要sum()时,直接1*3+2*2+3*4。当需要count()时,直接3+2+4。同时如果查询语句为where col = '3' 你只需要过滤 总行数/列的基数。当你的数据是有序的时,时间复杂度甚至可以降低至log(总行数/列的基数)。

延迟物化 Late Materialization

首先什么叫物化:实际上就是什么时候把列式的数据转化为行式的数据

select b from R where a = X and d = Y

在这里插入图片描述
延迟物化有以下几个优点:

  1. 很多select和aggregation操作,不需要整行数据,过早物化造成性能损失
  2. 如果数据是被压缩过的,那么过早物化需要解压数据,但很多操作可以直接下推到压缩数据上的
  3. 对操作系统缓存的利用率会更好。因为如果变成Row,会有很多其他类型的数据污染Cache Line
  4. 针对定长的列做块迭代处理,可以当成一个数组来操作,可以利用CPU的很多优势;相反,行存中列类型往往不一样,长度也不一样,还有大量不定长字段,难以加速;

块迭代 Block Iteration

每列的数据存储在一起,可以认为这些数据是以数组的方式存储的,基于这样的特征,当该列数据需要进行某一同样操作,可以使用SIMD进一步提升计算效率,即便运算的机器上不支持SIMD, 也可以通过一个循环来高效完成对这个数据块各个值的计算。
SIMD即"single instruction, multiple data"(单指令流多数据流)
在这里插入图片描述

隐式链接 Invisible Join

SELECT c.nation, s.nation, d.year, 
sum(lo.revenue) as revenue 
FROM customer AS c, lineorder AS lo, 
supplier AS s, dwdate AS d 
WHERE lo.custkey = c.custkey 
AND lo.suppkey = s.suppkey 
AND lo.orderdate = d.datekey 
AND c.region = 'ASIA' 
AND s.region = 'ASIA' 
AND d.year >= 1992 and d.year <= 1997 
GROUP BY c.nation, s.nation, d.year 
ORDER BY d.year asc, revenue desc;

方案一: 传统大表 join 小表

缺点:开始就进行了join,无法享受延迟物化带来的好处

方案二: 延迟物化

这个方式可以规避一开始做 join 的行为,具体方法为:

  1. 用 c.region = ‘ASIA’ 过滤 custom 表,并拿到满足条件的 custom key 的集合,同时记录 custom 表中满足条件的记录的位置
  2. 用 1 中获得的 custom key 来过滤 orderline 表,并拿到满足条件的记录的位置
  3. 遍历 2 中获得的位置列表,提取 suppplier key、order date 和 revenue 并且借助 custom key 和 1 中获取到的位置信息,提取 custom 表中的 c.nation 字段
  4. supplier 和 date 表的 join 类似处理

方案三: 隐式join

  1. 在每个维度表上应用对应的过滤条件,得到每个维度表(dimension table)满足条件的记录的 key,同时这个 key 也应该是事实表(the fact table)的外键(foreign key)。
    在这里插入图片描述

  2. 遍历事实表的各个外键列,使用 1 中得到的 key 来判断是否满足条件,生成一个满足条件的记录的位置信息的 bitmap ,并将这些 bitmap 做 AND 操作,生成最终过滤结果的 bitmap
    在这里插入图片描述

  3. 利用 2 中得到的 bitmap 依次提取各个维度表的外键,使用维度表的键来提取维度表中查询所需要的其他列。如果维度表的键是排过序的、从 1 开始连续的值,意味着维度表里面的列可以通过类似访问数组一样的方式提取出来(这一点会比传统的延迟物化方法快很多)。
    在这里插入图片描述

优化点性能提升

  1. 隐式join提升性能 50-75%
  2. 块迭代提升性能 5%-50%。差距比较大的主要看有没有压缩
  3. 压缩平均提升两倍性能
  4. 延迟物化提升接近3倍性能
    如果把这些优化措施都删除,性能跟行存差不多

http://chatgpt.dhexx.cn/article/PU1ELCmH.shtml

相关文章

android:stretchcolumns=0,1,2,3,android:stretchColumns用法

TableLayout是一个使用复杂的布局&#xff0c;最简单的用法就仅仅是拖拉控件做出个界面&#xff0c;但实际上&#xff0c;会经常在代码里使用TableLayout&#xff0c;例如做出表格的效果。本文主要介绍TableLayout的基本使用方法。 < ?xml version"1.0" encoding…

cannot set a row with mismatched columns

错误&#xff1a;cannot set a row with mismatched columns 错误背景原错误情况错误原因解决方法 错误背景 在希望将dataframe a 中的特定行移至dataframe b 时出错&#xff0c;记录下自己使用的方法 原错误情况 #dataframe a 已知 a{ab:[1,2,3],bb:[3,4,5],cb:[4,5,6]} a …

TableLayout中stretchColumns、shrinkColumns的用法

android:stretchColumns"1" android:shrinkColumns"1"这两个属性是TableLayout所特有的&#xff0c;也是这两个属性影响了子对象的布局。 表格布局是按照行列来组织子视图的布局。表格布局包含一系列的Tabrow对象&#xff0c;用于定义行&#xff08;也可以…

TableLayout中stretchColumns和shrinkColumns使用

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:orientatio…

基于JAVA的即时通信软件

一.设计任务书 1.1 设计任务 本文设计的是一个简单的即时通信软件&#xff0c;利用 Java Socket 进行点到点通信&#xff0c;其工作机制模仿即时通信软件的基本功能&#xff0c;已实现的功能有&#xff1a; 客户端登录 客户端退出 群组成员之间传输文字或图片信息 该软件分为客…

一文教你用java实现即时通讯软件的设计

即时通讯软件即所谓的聊天工具&#xff0c;其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具&#xff0c;使用Socket建立通讯渠道&#xff0c;多线程实现多台计算机同时进行信息的传递&#xff0c;swing技术等进行实际开发相对比较合适。通过…

即时通讯软件七大优势详解

在以前&#xff0c;即时通讯软件被认为是一种专供个人使用的通信工具&#xff0c;随着社会的发展&#xff0c;各大商家企业开始慢慢接受这种通信工具并利用其协调公司内部沟通&#xff0c;从而满足公司的业务需求。那么即时通讯软件优势有哪些&#xff1f;为你细数它的七大优势…

开发IM即时通讯容易吗?需要什么技术

即时通讯现在已经随着互联网技术的应用走进了千家万户&#xff0c;跟早些年的通信工具不同&#xff0c;现在的即时通讯技术已经涵盖了语音即时通讯、视频即时通讯、文字即时通讯等多种方式&#xff0c;而开发即时通讯也成了很多互联网企业投身这一行业后想要尝试的内容。开发即…

桌面软件开发框架大赏

本文基于海康威视桌面端技术专家刘晓伦在「RTC Dev Meetup • 杭州站丨大前端时代的业务架构和跨端实践」活动中分享内容二次整理。 以下正文&#xff1a; 今天要与大家分享 19 款桌面软件开发框架&#xff0c;我将它们分了四类&#xff0c;然后分别就每个类别做相应的介绍&a…

仿QQ即时通讯软件开发-赖国荣-专题视频课程

仿QQ即时通讯软件开发—7495人已学习 课程介绍 会使用JAVA的Swing做UI&#xff0c;学会用JAVA操作数据库&#xff0c;用Java的网络编程&#xff0c;多线程编程&#xff0c;制作一个仿QQ的即时通讯软件&#xff0c;实现在局域网或者互联网通讯 课程收益 制作仿QQ即时通讯软件…

Qt制作局域网即时通讯软件

Qt制作局域网即时通讯软件 利用Qt制作的局域网即时通信软件&#xff0c;可实现文本信息、表情包、图片、文档等的传输功能。界面风格模仿的Tim&#xff0c;所以本软件取名为Timi&#xff0c;tim的mini版本。 登录界面&#xff1a;使用之前做的登录界面&#xff0c;后续修改。原…

java实现即时通讯软件

导读:即时通讯软件即所谓的聊天工具,其主要用途是用于文字信息的传递与文件传输。使用eclipse作为即时通讯软件的开发工具,使用Socket建立通讯渠道,多线程实现多台计算机同时进行信息的传递,swing技术等进行实际开发相对比较合适。通过一些轻松的注册登录后,在局域网中即…

IM即时通讯软件系统源码安卓、苹果、PC端全开源!

demo软件园每日更新资源,请看到最后就能获取你想要的: ​ 1.《计算机系统结构&#xff1a;解析思路习题》课后答案 "本书是按照全国高等教育自学考试指导委员会制定的计算机及应用专业独立本科段“计算机系统结构自学考试大纲’’要求&#xff0c;并以其指定的自学教材内…

即时通讯软件开发:如何解决网络不稳定的问题?

随着智能手机和互联网的普及&#xff0c;即时通讯软件成为人们生活中不可或缺的一部分。随着即时通讯软件的使用越来越普及&#xff0c;网络不稳定的问题也越来越严重。为了提供更好的服务&#xff0c;我们需要解决这个问题。 网络不稳定的原因 网络不稳定可能由许多因素引起…

im即时通讯软件开发:一文即懂什么是高并发

在即时通讯网社区里&#xff0c;多是做IM、消息推送、客服系统、音视频聊天这类实时通信方面的开发者&#xff0c;在涉及到即时通讯技术时聊的最多的话题就是高并发、高吞吐、海量用户。 代码还没开始写&#xff0c;就考虑万一哪天这IM用户量破百万、千万该怎么办的问题&#…

即时通讯软件源代码_提高软件开发效率的神器,马上收藏起来吧

根据用户开发水平的差异&#xff0c;力软敏捷开发框架提供多种实现业务功能的开发模式。 如果您是初级开发者或者您根本就不会编程那也不要紧&#xff0c;系统可以根据开发向导直接进行功能开发&#xff0c;不需要编写一行代码也无需编译就个完成开发过程。 如果您是一名专业的…

QT开发的即时通讯聊天软件

最近项目需求用QT开发了一款即时通讯软件&#xff0c;差不多了上几个图看看。 登陆界面 主界面-用户列表 最近消息界面 好友聊天界面 文件传输界面 查找和添加好友 消息管理器 系统设置界面 先传这么多&#xff0c;&#xff1a;&#xff09;

基于C++的即时通信软件设计

目录 — 、 概 述 1 1 . 1 设 计 目 的 &#xff1a; 1 1 . 2 设 计 内 容 &#xff1a; 1 1 . 2 . 1 功 能 设 计 &#xff1a; 1 1 . 2 . 2 界 面 设 计 &#xff1a; 1 1 . 2 . 3 客 户 端 、 服 务 器 设 计 &#xff1a; 1 1 . 3 设 计 要 求 &#xff1a; 1 二 、 设 计 …

企业即时通讯软件开发基本功能有哪些?

即时通讯是基于互联网技术的新型交流沟通方式&#xff0c;是目前最流行的通讯方式&#xff0c;广泛的应用市场使得各种各样的即时通讯软件系统也层出不穷&#xff0c;企业即时通讯就是其中的一种延伸。是一种面向企业终端使用者的网络营销、网络沟通和内容管理的工具服务&#…

IM即时通讯软件开发

废话不多说&#xff0c;要想知道社交IM系统软件公司哪家靠谱&#xff0c;教你怎么辨别软件开发公司靠谱。 一&#xff1a;哪些IM即时通讯软件开发公司不靠谱&#xff1f;用十余年经验&#xff0c;总结出行业公司不靠谱通病。 1、对于一款社交IM系统软件&#xff0c;软件公司给…