View
713
Download
11
Category
Preview:
DESCRIPTION
C-Store底层存储设计原理描述,主要参考Mike Stonebraker的论文:C-Store: A Column-oriented DBMS。
Citation preview
C-Store底层存储设计
梁智超
liangzhichao@chinamobile.com
C-Store设计思想
• 在只读的数据仓库应用中,支持更新事务也是很有必要的!
• 在实时的数据仓库应用中,将新灌入数据的可见性延迟压得越低越好!
• 但基于读优化的数据结构,很难再提供高效的更新性能!
• C-Store将两个针对读和写分别优化的存储模块集成到一起来解决读写两难的困境!
C-Store数据模型
• 逻辑上:数据库(Database)由表(Table)组成,表由属性列(Column)组成,支持唯一主键和外键,使用标准SQL查询。
• 物理上:C-Store只实现投影(Projection),每
个投影与一张表关联,包含了该表中的一个或多个属性列以及其任意数目其它表中的属性列。
EMP
Name Age Dept Salary
Bob 25 Math 10K
Bill 27 EECS 50K
Jill 24 Biology 80K
DEPT
Name Floor
Biology 10
Math 8
EECS 19
C-Store数据模型(cont.)
EMP1(name, age | age)
Name Age
Jill 24
Bob 25
Bill 27
EMP2(dept, age, DEPT.floor | DEPT.floor)
Dept Age DEPT.floor
Math 25 8
Biology 24 10
EECS 27 19
EMP3(name, salary | salary)
Name Salary
Bob 10K
Bill 50K
Jill 80K
DEPT1(name, floor | floor)
Name Floor
Math 8
Biology 10
EECS 19
EMP
Name Age Dept Salary
Bob 25 Math 10K
Bill 27 EECS 50K
Jill 24 Biology 80K
DEPT
Name Floor
Biology 10
Math 8
EECS 19
SK Age
1 24
2 25
1 27
SK Name
1 Jill
2 Bob
1 Bill
C-Store数据模型(cont.)
• 投影以列存的方式存储,即投影中有几个属性列,就有几个存储列的数据结构。
• 投影通过基于排序属性值的水平分区切割成段(Segment),每个段都会有一个标识。
• 段中的每个属性列的值都会关联一个存储主键。
EMP1(name, age | age)
Name Age
Jill 24
Bob 25
Bill 27
SID = 1
SID = 2
段中具有相同存储主键的属性列构成一条逻辑上的记录!
C-Store存储设计
• 读写分离,最新的更新数据全部写到Writeable Store (WS),只读数据存储在Read-Optimized Store (RS)。
• 查询时需要将RS和WS中的数据合并处理。
Writeable Store
Read-Optimized Store
Tuple Mover
1) WS和RS均采用列存储,分享相同的物理设计,包括投影、段等;
2) WS中的段与RS中的段一一对应; 3) WS中SK是显示存储的,RS中SK根
据列属性值的存储位置计算得到; 4) WS中的数据通过Tuple Mover实现
与RS中数据的Merge;
RS中数据存储和压缩
• RS中存储大部分数据,且将数据库表转化为多个投影会导致数据膨胀,所以RS中的数据需要进行压缩。
• RS中的数据压缩就是对投影中每个列的压缩,包括四种不同情况:
压缩列就是投影中的排序列,且压缩列中的distinct值很少
压缩列不是投影中的排序列,且压缩列中的distinct值很少
压缩列就是投影中的排序列,且压缩列中的distinct值很多
压缩列不是投影中的排序列,且压缩列中的distinct值很多
RS中数据存储和压缩(cont.)
• 压缩列就是投影中的排序列,且压缩列中的distinct值很少。
Salary
3000
3000
3000
8000
8000
8000
8000
(8000, 3, 4)
(3000, 0, 3)
使用Run-Length Encoding将连续的列属性值转
化为三元组(列属性值,在列中第一次出现的位置,出现次数)
整个列就可以使用多个三元组来表示
所有三元组使用B树索引来管理,B树
索引中所有节点不留空闲空间,使用大数据块来存节点以降低B树的层数
RS中数据存储和压缩(cont.)
• 压缩列不是投影中的排序列,且压缩列中的distinct值很少。
Salary
8000
3000
3000
8000
8000
3000
8000
列属性值转化为二元组(列属性值,该列属性值出现在列中位置的Bitmap)
(8000, 1001101) (3000, 0110010)
因为distinct值很少,所以每个二元组中的Bitmap都很稀疏,可以继续使用Run-Length Encoding对Bitmap进行压缩
构造B树将列中的每个位置映射给该位置上的列属性值,以快速定位列中每个位置上的列属性值
RS中数据存储和压缩(cont.)
• 压缩列就是投影中的排序列,且压缩列中的distinct值很多。
Salary
3000
4000
4000
4500
6800
7400
8000
将列属性值表示成为前一个列属性值的增量 Salary
3000
1000
0
500
2300
600
600
使用面向块的压缩算法对转换后的数据进行压缩,类似于IBM的VSAM对B树索引主键的编码
使用B树索引管理块级的压缩对象, B树索引中所有节点不留空闲空间
RS中数据存储和压缩(cont.)
• 压缩列不是投影中的排序列,且压缩列中的distinct值很多。
Salary
7400
6800
4000
8000
6800
4000
4500
可以选择不压缩数据
直接使用B树索引管理数据,B树
索引中所有节点不留空闲空间,使用大数据块来存节点以降低B树的层数
WS中数据存储
• WS中的数据比RS中的数据少很多,所以不进行数据压缩。
• 投影中每列的更新数据都使用二元组(列属性值,SK)来表示,且针对SK建B树索引。
• 投影中的排序属性列使用附加的二元组(排序属性值,该排序属性值第一次出现的SK)来表示,且针对排序属性值建B树索引。
• 先查询排序属性列二元组的B树索引,再查询其他列二元组的B树索引。
WS中数据存储(cont.)
Name列更新数据的二元组
Jill 1
Tom 2
Rose 3
Bob 4
Bill 5
EMP1(name, age | age)的更新数据
SK Name Age
1 Jill 24
2 Tom 24
3 Rose 25
4 Bob 25
5 Bill 27
排序属性列的附加二元组
24 1
25 3
27 5
(针对SK建 B树索引)
(针对排序 属性建B树 索引)
当使用排序属性进行查询时,先查询排序属性列二元组的B树索引,获取符合条件的SK,再查询其他列二元组的B树索引获取对应的属性列值
C-Store直接使用BerkeleyDB来管理WS!
Recommended