列数据库存储技术笔记

列数据库存储技术

这个slide:VLDB 2009 Tutorial on Column-Stores将列数据库相关的技术keyword都列举出来了:storage && compression、query execution engine、CPU、Memory。

本文就是对 compression 这个点的相关技术的收集:

行存储的数据库多采用稠密索引,如果数据库文件中的数据不是按照关键字的顺序排列(例如按照大小、时间前后),需要对为每一行数据基于此关键字创建一个索引项。会导致:
1 增加存储空间
2 增加数据更新时的代价。

因此基于行存储的RDBMS系统为表中的所有列创建索引是不现实的,所以如果一个查询sql的查询条件是基于一个没有索引的列,则数据库必须做全表扫描,数据量大的情况下响应效率不高。

列存储可以为所有列创建稀疏索引,每个列的值被压缩算法压缩之后顺序存储到数据块中,索引只需建立到数据块上,索引的存储空间小,而且更新维护的代码也小。也就说将行存储中的行级索引更新为列存储的数据块索引(列数据库主要面向OLAP场景,查询SQL多为聚合类型,每次查询的数据量很多,硬盘数据的访问加载都是block级别,不像OLTP查询只是少量的几条。这也可以理解为什么HiStore说大数据量下的查询效率高于MySQL,而单条查询却不会高于MySQL)。列存储下,查询语句通过索引定位到某一个数据块,然后使用某种查询算法访问数据块中的顺序数据,避免任何字段的查询导致全表扫描。

优点:

  • 数据高压缩率,节省存储空间
  • 减少磁盘IO数量,只取所需
  • 适合大批量数据的aggregation queries

缺点:

  • 空间换时间,数据还原、计算需要CPU资源

存储关键技术

列数据库的按照数据块为单位来存储数据,常见存储的压缩算法有如下几种:

  • 游程长度压缩算法(Run-Length Encoding,RLE)
  • 词典编码算法(Dictionary Encoding)
  • 位向量算法(Bit-Vector Encoding)

游程长度压缩算法

RLE(介绍) 算法是一个无损压缩算法(无损数据压缩算法的历史),核心思想是将一个序列连续重复出现N此的元素(元素组)转化为一个三元组(元素值,序列中第一次出现的位置,出现次数)。例如AAAAABBC,RLE压缩之后是(A,1,5),(B,6,2),(C,8,1),so问题来了,如果是ABCABCABC类型的数据奈若何呢?AABCDEEF这种基数类型大的数据又如何呢?
这里有相应的解决方案介绍:算法系列之八:RLE行程长度压缩算法

更厉害的:
RLE是对连续重复的数据进行压缩处理的---这个在图片、视频、音频领域都都适用,LZ77是对不连续重复的数据进行压缩处理的(也就是下面的词典编码算法). 在字符串匹配场景中,LZ77的压缩率会比RLE要高,LZ77用于ZIP压缩:ZIP压缩算法详细分析及解压实例解释,RLE + Huffman(Deflate/Inflate)。

词典编码算法

词典编码算法通过“原始值-替代值”的映射词典,将数据中”原始值“替换为更为简短的“替代值”。具体的实现算法分2种:
第一种是查找正在压缩的字符序列是否在以前输入的数据中出现过,然后用已经出现过的字符串替代重复的部分,它的输出仅仅是指向早期出现过的字符串的“指针”。例如:LZ77以及改良版LZ78、LZSS算法。

借用别人ppt中的图片,️

LZ77算法包括一个(sliding window滑动窗口,大概是一个容量可变的存储器)和一个预读缓存器(read ahead buffer)。sliding window是由0-64K的input stream,LZSS是用4K的sliding window.sliding window后面的字节填充预读缓存器,预读缓存器的大小通常在0-258K,与sliding window对应的.
LZ77就是处理sliding window和预读缓存器的匹配,如果这个匹配的长度大于最小匹配长度(最小匹配长度取决于编码器,通常取决于sliding window的长度。比如一个4K的sliding window,最小匹配长度为2),然后输出一个,长度(length)是这个匹配的长度,距离(distance)是在向前多少字节的地方匹配的。

第二种是基于源数据中创建一个“短语词典(dictionary of the phrases)”,短语可以是任意字符的组合。算法在编码数据过程中遇到已经在词典中出现的“短语”时,就将原始值替换为这个词典中的短语的“替换值”。典型代表是:LZW,LZW算法的专利是美国Unisys所有,非商业软件公司可以免费试用LZW。

再次借用别人ppt中的图片,

位向量编码算法

这个听着高大上的算法其实就是位图索引算法,适用于低基数的列,相对于B树索引,它的count,and,or操作更有效,位图索引位存放的是0,1的bit,相对于B树索引,占字节数特别少,不适合update、insert、delete频繁的列-因为要一个数据的更新可能会导致2个位图向量的更新(分段位图索引 Multi Components Bitmap Index)。
如果数据基数大,创建的位图索引会越来越多,空间占用也会很大,所以,位图索引 + RLE 可以算作天作之合,例如:

id 年龄 消费
1 25 60
2 45 60
3 50 75
4 50 100
5 50 120
6 70 110
7 85 140
8 30 260
9 25 350
10 45 270
11 50 260
12 60 400

对年龄和消费创建位图索引。

对于“年龄”字段有7个值,位图索引有7个向量:
25: 100000001000
30: 000000010000
45: 010000000100
50: 001110000010
60: 000000000001
70: 000001000000
85: 000000100000

查询所有年龄在[30,55]之间用户的消费数据:
30: 000000010000 and 45: 010000000100 and 60: 000000000001

在这个例子下年龄是稀疏字段,除非有龟鹤延年的人,正常数据范围是1-100,假设有天地同寿的仙人消费记录,随着年龄的数据增多,向量个数增多,占用的空间也会增多,这时应该召唤压缩算法:RLE。

算法思想:
就是将1前面的N个0用少量的二进制数字记录。

算法规则:

  • n是向量中某个1之前0的个数
  • e是n的二进制格式下的数据
  • m是e的长度,如果n=0,m=0;n=1,m=0
  • t是(m-1)个'1'和1个'0'组成的字符串,如果n=0,t='0';n=1,t='0'

例如:
示例1:
字符串:00000000000001,不用数了,1之前真的是13个0,n=4,13=0b1101,e=1101,m=3,t=1110,压缩之后的字符串为:11101101
示例2:
字符串:0,压缩:00
示例3:
字符串:1,压缩:01
示例4:
字符串:1100000010000000001,切分为4组字符串:[1,1,0000001,0000000001],对应的压缩组:[00,00,110110,11101001],最终的字符串:000011011011101001

这里有更详细、更多的位图压缩算法:位图索引算法

参考:java bitmap/bitvector的分析和应用

结束

这个只是存储相关的,执行过程的优化和cpu cache line黑科技的应用都有待挖掘、总结~~~

时间: 2024-09-23 13:59:40

列数据库存储技术笔记的相关文章

html5-HTML5本地数据库存储问题

问题描述 HTML5本地数据库存储问题 ps:环境:微信 在微信公众号开发中,使用html5本地数据库存储技术,对服务器的数据进行缓存到 手机上.经电脑谷歌浏览器测试能正常插入数据,也能查出数据.布署到微信上发现sql语句执行了,但没有查出数据. //这里输出的是支持 if (!window.openDatabase) { alert("不支持"); } else { alert("支持"); } 解决方案 html5本地存储是比较新的,在浏览器厂商的支持上还有一定

原厂解读:达梦数据库列存储技术原理与实现

本次分享内容由三个部分组成: 列存储数据组织实现 智能索引的实现 自适应压缩算法   目前数据库主流数据组织技术分为数据按行存储和数据按列存储,达梦数据库表数据的存储方式同时支持行存储和列存储.行存储是以记录为单位进行存储的,数据页面中存储的是完整的若干条记录:列存储是以列为单位进行存储的,每一个列的所有行数据都存储在一起,一个段只存储一个列的数据,而且一个指定的页面中存储的都是某一个列的连续数据.   列存表的存储方式有以下几个优点:   同一个列的数据都是连续存储的,可以加快某一个列的数据查

SQL Server 2016 列存储技术做实时分析

title: SQL Server 2016 列存储技术做实时分析 author: 风移 摘要 数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高.使用传统RDBMS数据分析架构,遇到了前所未有的挑战,高延迟.数据处理流程复杂和成本过高.这篇文章讨论如何利用SQL Server 2016列存储技术做实时数据分析,解决传统分析方法的痛点. 传统RDBMS数据分析 在过去很长一段时间,企业均选择传统的关系型数据库做OLAP和Data Warehouse工作.这一节讨论传统R

海量高性能列式数据库HiStore技术架构解析

HiStore 介绍 HiStore是阿里中间件团队研发的数据库产品,是一款基于独特的知识网格技术的列式数据库,定位于海量数据高压缩比列式存储,是低存 储成本,低维护成本,海量数据OLAP存储引擎;有效的解决了海量数据存储的成本问题,以及在百亿数据场景下支持实时高效的多维度自 由组合的检索. 关键字: 列式,分布式,高压缩比; 一.HiStore HiStore 专门针对OLAP应用程序进行设计和优化,在常规X86服务器上,HiStore可以在百亿数据场景下进行高性能,多维度自由组合 的adho

MSSQL · 特性分析 · 列存储技术做实时分析

摘要 数据分析指导商业行为的价值越来越高,使得用户对数据实时分析的要求变得越来越高.使用传统RDBMS数据分析架构,遇到了前所未有的挑战,高延迟.数据处理流程复杂和成本过高.这篇文章讨论如何利用SQL Server 2016列存储技术做实时数据分析,解决传统分析方法的痛点. 传统RDBMS数据分析 在过去很长一段时间,企业均选择传统的关系型数据库做OLAP和Data Warehouse工作.这一节讨论传统RDBMS数据分析的结构和面临的挑战. 传统RDBMS分析架构 传统关系型数据库做数据分析的

数据库表中的一列值为:2007-06-12 列的存储类型为:datatime 但是在Asp.net网面上通过DataList绑定后显示的值为:2007-06-12 0:00:00?????????????????

问题描述 数据库表中的一列值为:2007-06-12列的存储类型为:datatime但是在Asp.net网面上通过DataList绑定后显示的值为:2007-06-120:00:00?怎么样通过DataList控件绑定后让他不显示:0:00:00,而只显示:1985-06-12 解决方案 解决方案二:sql语句不要直接选出时间字段t,拼字符串year(t)+month(t)+day(t)asnewtime解决方案三:'<%#Bind("DateTime","{0:yyy

基于NoSQL数据库的大数据存储技术的研究与应用

基于NoSQL数据库的大数据存储技术的研究与应用 孙中廷 实际工程中采集和处理的数据量特别大,这对传统数据库技术提出巨大挑战.针对传统关系型数据库存储速度慢.对硬件要求高的缺点,提出一种以NoSQL数据库为基础的大数据处理方法,打破了传统数据库的关系模型,数据以一种自由的方式存储,而不依赖固定的表结构.该方法主要是将经验模态分解并与NoSQL数据库技术相结合,应用于大型结构件的变形监测中,构建出一个基于NoSQL数据库系统的大型结构件变形监测系统.仿真结果表明,该方法可以实现大型结构件变形监测数

讲解数据库加密技术的功能特性与实现方法

信息安全的核心就是数据库的安全,也就是说数据库加密是信息安全的核心问题.数据库数据的安全问题越来越受到重视,数据库加密技术的应用极大的解决了数据库中数据的安全问题,但实现方法各有侧重. 随着电子商务逐渐越来越多的应用,数据的安全问题越来越受到重视.一是企业本身需要对自己的关键数据进行有效的保护:二是企业从应用服务提供商(Application Service Provider,ASP)处获得应用支持和服务,在这种情况下,企业的业务数据存放在ASP处,其安全性无法得到有效的保障.因为传统的数据库保

Wince MFC OLE DB SQLCE数据库访问技术(二):嵌入式目标平台创建本地数据库sdf文件

前言 上一节已经讲述了嵌入式目标平台上安装sqlCE,本章将介绍如何在目标平台上创建本地数据库sdf文件. 备注:博客中所有关于Wince MFC OLE DB   SQLCE数据库访问技术的文章都是基于SQL Server 2005 Compact Edition即 sqlCE 3.x     在讲述sqlCE之前,先来了解下,sqlCE优于wince 自带数据库的特点: 类别 对象 最大大小限制 存储 列名 128 个字符   表中的列数 1024 行大小 8060 字节   数据库密码 4