行迈靡靡,中心如醉
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、分区数据库设计和操作
众所周知,对数据库分区可以降低延迟,提高数据吞吐量。分区可以对大型表易于管理,维护高效,查询时减少要扫描的数据量。分区可以充分利用资源,增加系统的可用性。
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.使用范围分区,列表分区是解决数据分布不均匀的方法。