ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

在传统的行式数据库系统中,数据按如下顺序存储:

Row WatchID JavaEnable Title GoodEvent EventTime
#0 89354350662 1 Investor Relations 1 2016-05-18 05:19:20
#1 90329509958 0 Contact us 1 2016-05-18 08:10:20
#2 89953706054 1 Mission 1 2016-05-18 07:38:00
#N

处于同一行中的数据总是被物理的存储在一起。

常见的行式数据库系统有:MySQLPostgresMS SQL Server

在列式数据库系统中,数据按如下的顺序存储:

Row: #0 #1 #2 #N
WatchID: 89354350662 90329509958 89953706054
JavaEnable: 1 0 1
Title: Investor Relations Contact us Mission
GoodEvent: 1 1 1
EventTime: 2016-05-18 05:19:20 2016-05-18 08:10:20 2016-05-18 07:38:00

这些示例只显示了数据的排列顺序。来自不同列的值被单独存储,来自同一列的数据被存储在一起。

常见的列式数据库有:Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。

不同的数据存储方式适用不同的业务场景,数据访问的场景包括:进行了何种查询、多久查询一次以及各类查询的比例;每种类型的查询(行、列和字节)读取多少数据;读取数据和更新之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等。

系统负载越高,依据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统能够同时适用所有不同的业务场景。如果系统适用于广泛的场景,在负载高的情况下,要兼顾所有的场景,那么将不得不做出选择。是要平衡还是要效率?

OLAP场景的关键特征

  • 绝大多数是读请求

  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。

  • 已添加到数据库的数据不能修改。

  • 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。

  • 宽表,即每个表包含着大量的列

  • 查询相对较少(通常每台服务器每秒查询数百次或更少)

  • 对于简单查询,允许延迟大约50毫秒

  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)

  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)

  • 事务不是必须的

  • 对数据一致性要求低

  • 每个查询有一个大表。除了他以外,其他的都很小。

  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中

很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。

列式数据库更适合OLAP场景的原因

列式数据库更适合于OLAP场景(对于大多数查询而言,处理速度至少提高了100倍),下面详细解释了原因(通过图片更有利于直观理解):

行式

列式

看到差别了么?下面将详细介绍为什么会发生这种情况。

输入/输出

  1. 针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这将帮助你最少减少20倍的I/O消耗。

  2. 由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步降低了I/O的体积。

  3. 由于I/O的降低,这将帮助更多的数据被系统缓存。

例如,查询«统计每个广告平台的记录数量»需要读取«广告平台ID»这一列,它在未压缩的情况下需要1个字节进行存储。如果大部分流量不是来自广告平台,那么这一列至少可以以十倍的压缩率被压缩。当采用快速压缩算法,它的解压速度最少在十亿字节(未压缩数据)每秒。换句话说,这个查询可以在单个服务器上以每秒大约几十亿行的速度进行处理。这实际上是当前实现的速度。

CPU

由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行上执行所有操作更加高效。同时这将有助于实现一个几乎没有调用成本的查询引擎。如果你不这样做,使用任何一个机械硬盘,查询引擎都不可避免的停止CPU进行等待。所以,在数据按列存储并且按列执行是很有意义的。

有两种方法可以做到这一点:

  1. 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。

  2. 代码生成:生成一段代码,包含查询中的所有操作。

这是不应该在一个通用数据库中实现的,因为这在运行简单查询时是没有意义的。但是也有例外,例如,MemSQL使用代码生成来减少处理SQL查询的延迟(只是为了比较,分析型数据库通常需要优化的是吞吐而不是延迟)。

请注意,为了提高CPU效率,查询语言必须是声明型的(SQL或MDX), 或者至少一个向量(J,K)。查询应该只包含隐式循环,允许进行优化。

联机分析的列式数据库 clickHouse相关推荐

  1. 数仓选型必列入考虑的OLAP列式数据库ClickHouse(上)

    概述 定义 ClickHouse官网地址 https://clickhouse.com/ 最新版本22.4.5.9 ClickHouse官网文档地址 https://clickhouse.com/do ...

  2. 2022-05-19 列式数据库-Clickhouse

    什么事列式数据库,顾名思义它与平时的主流关系型数据库不太一致,例如mysql 它是行式数据库,什么意思呢? image.png 这就是普通的行式数据库的存储,一行是一条完整的数据; 接下来看看列式数据 ...

  3. 数据仓库一些整理(列式数据库)

    术语备注: 1.OLTP.这是on-line transaction processing的简写.翻译成联机事务处理.就是在线交易的业务数据.这方面的数据库是关系型数据库. 2.OLAP.On-Lin ...

  4. 最近很火的 ClickHouse【列式数据库】 是什么?

    ClickHouse 是 Yandex(俄罗斯最大的搜索引擎)开源的一个用于实时数据分析的基于列存储的数据库,其处理数据的速度比传统方法快 100-1000 倍. ClickHouse 的性能超过了目 ...

  5. 列式数据库,OLAP与OLTP

    刚接触clickhouse,对于olap与oltp有点蒙圈.记录一下当前的认知,比较浅显,有志之士多补充修正. OLAP与OLTP OLTP:联机事务处理.主要用于数据库,对业务数据进行数据采集,cr ...

  6. 行式数据库与列式数据库

    开发用了很久的Vertica,知道它是"列式数据库"但一直没有去研究过列式数据库的一些特性,现在来总结一下. 列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处 ...

  7. 列式数据库总结(特点)

    简单罗列了一些选择行数据库还是列数据库的权衡依据.当然,如果能够把数据全放在内存中,那么使用内存数据库性能会更好. 在只需要根据某几列来聚合数据的时候按列的数据组织方式更有效.因为这样只需要读取一部分 ...

  8. 大剑无锋之你所知道的列式数据库有哪些?列式数据库的好处在哪?【面试推荐】

    列式数据库有哪些? GBase 8a.Hbase 什么是列式数据库? 列式数据库是以列相关存储架构进行数据存储的数据库,主要适合于批量数据处理和即时查询.相对应的是行式数据库,数据以行相关的存储体系架 ...

  9. 列式数据库和行式数据库的区别

    前言 最近学习了hbase,其中涉及的到知识就是hbase采用了列式存贮,而用惯了mysql的我当然一脸懵逼,于是有了本篇文章,本文不是论文,所有涉及的知识点他人都有讲,我只是为了记录一下,如果想要看 ...

最新文章

  1. 面试必备,各种技术知识集大成之项目~
  2. 增强for循环_增强for循环实际用法
  3. 【学亮IT手记】oracle集合运算
  4. android SharedPreferences设置初始密码,并修改密码
  5. 牛客题霸 NC12 重建二叉树
  6. (2)python_enumerate
  7. 【后台任务】在线程池线程上运行代码(6)
  8. 工作中要注意拍照录像,证明工作完成
  9. 智慧树知到python程序设计基础第三章答案_知到智慧树Python程序设计基础章节答案...
  10. 数据库之SQL增删改查(UPDATE,DELETE,TOP,COMPUTE,WHERE子句)
  11. 多元线性模型的分位数回归
  12. 微软Windows 10 MSDN官方ISO镜像正式版下载
  13. 论文笔记:Deep Object Co-Segmentation(ACCV2018)
  14. 戴尔服务器配置RAID
  15. react中ref使用方法解析
  16. 使用python把批量xls文件转换为xlsx
  17. Sourcetree 跳过注册方法 for MAC
  18. CSS Table(表格)
  19. 输出图案-平行四边形
  20. 基于51单片机的霓虹灯c语言,基于51单片机霓虹灯.pdf

热门文章

  1. 论接单报价管理与ERP信息化管理的重要性
  2. eclipse在server中tomcat server找不到的问题
  3. DateTimeToUnix/UnixToDateTime 对接时间转换
  4. Qt 如何处理密集型耗时的事情
  5. 转帖不会乱码的,powershell网络蜘蛛
  6. AMD and CMD are dead之KMD.js依赖可视化工具发布
  7. Easy UI中dategrid的getSelections方法只能获取一个id的解决办法
  8. 个人电脑的楷模:新款IMac G5
  9. Mac OS使用技巧之十三:Finder中标记的使用
  10. SQLI DUMB SERIES-16