高性能时序数据库DolphinDB(中)-数据库分区篇

行迈靡靡,中心如醉


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、分区数据库设计和操作

众所周知,对数据库分区可以降低延迟,提高数据吞吐量。分区可以对大型表易于管理,维护高效,查询时减少要扫描的数据量。分区可以充分利用资源,增加系统的可用性。

1.分区类型

DolphinDB database 支持多种分区类型: 范围分区、哈希分区、值分区、列表分区与复合分区。选择合适的分区类型,有助于用户根据业务特点对数据进行均匀分割。

1.1 范围分区

范围分区的区间由区间向量的任意两个相邻元素定义。区间包含起始值,不包含结尾值。如下:

n=100000
ID=rand(10,n)
x=rand(1.0,n)
t=table(ID,x)
db=database("dfs://rengedb",RANGE,0 5 10)

pt=db.createPartitonedTable(t,`pt,`ID)
pt.append(t)

pt=loadTable(db,`pt)
select count(x) from pt;

两个分区:【0,5)和【5,10),ID为分区列,并使用append!在数据库db中保存t为分区表pt

1.2 哈希分区

哈希分区是用哈希函数进行分区产生指定数量的分区的简便方法,但不能保证分区的大小一致。而且查找列中连续范围时效率低。如下:

n=1000000
ID=rand(10,n)
x=rand(1.0,n)
t=table(ID,x)
db=database("dfs://hashdb",HASH[INT,2])
pt = db.createPartitionedTable(t, `pt, `ID)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt;

数据库db有两个分区。使用ID作为分区列,并使用函数append!在数据库db中保存表t为分区表pt。

1.3 值分区

顾名思义一个值代表一个分区。

n=1000000
month=take(2000.01M..2016.12M, n)
x=rand(1.0, n)
t=table(month, x)

db=database("dfs://valuedb", VALUE, 2000.01M..2016.12M)

pt = db.createPartitionedTable(t, `pt, `month)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt;

定义了一个具有204个分区的数据库db。每个分区是2000年1月到2016年12月之间的一个月(如下图)。在数据库db中,表t被保存为分区表pt,分区列为month。

1.4 列表分区

n=1000000
ticker = rand(`MSFT`GOOG`FB`ORCL`IBM,n)
x=rand(1.0, n)
t=table(ticker, x)

db=database("dfs://listdb", LIST, [`IBM`ORCL`MSFT, `GOOG`FB])
pt = db.createPartitionedTable(t, `pt, `ticker)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt;

第一个分区包含3个股票代号,第二个分区包含2个股票代号。

1.5 组合分区

组合(COMPO)分区可以定义2或3个分区列。每列可以独立采用范围(RANGE)、值(VALUE)、哈希(HASH)或列表(LIST)分区。组合分区的多个列在逻辑上是并列的,不存在从属关系或优先级关系。

n=1000000
ID=rand(100, n)
dates=2017.08.07..2017.08.11
date=rand(dates, n)
x=rand(10.0, n)
t=table(ID, date, x)

dbDate = database(, VALUE, 2017.08.07..2017.08.11)
dbID=database(, RANGE, 0 50 100)
db = database("dfs://compoDB", COMPO, [dbDate, dbID])

pt = db.createPartitionedTable(t, `pt, `date`ID)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt;

如上可以看出值域有5个分区,在20170807这个里,有两个区间域。若组合分区有一列为值分区,创建后可使用addValuePartitions函数来追加分区

注意:

1.FLOAT和DOUBLE数据类型不可作为分区字段。
2.为了性能考虑,建议将STRING转化为SYMBOL再用于分区列.
3.建议一个分区未压缩前的原始数据大小不超过1GB。
4.降低分区粒度可采用以下几种方法:(1)采用组合分区(COMPO);(2)增加分区个数;(3)将范围分区改为值分区。
5.使用范围分区,列表分区是解决数据分布不均匀的方法。


总结

分区的总原则是让数据管理更加高效,提高查询和计算的性能,达到低延时和高吞吐量。选择合适的分区字段;分区粒度不要过大;分区粒度不要过小;如何将数据均匀分区;数据库定义的分区字段类型和数据表实际采用的时间类型可以不一致,只要保证定义的分区字段数据类型精度小于等于实际数据类型即可;不同表相同分区的数据存于同一节点。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值