DolphinDB分区数据库教程(一)
对数据库进行分区可以极大的降低系统响应延迟同时提高数据吞吐量。具体来说,分区有以下几个好处:
- 分区使得大型表更易于管理。对数据子集的维护操作也更加高效,因为这些操作只针对需要的数据而不是整个表。一个好的分区策略将通过只读取满足查询所需的相关数据来减少要扫描的数据量。当所有的数据都在同一个分区上,对数据库的查询,计算,以及其它操作都会被限制在磁盘访问IO这个瓶颈上。
- 分区使得系统可以充分利用所有资源。一个良好的分区方案搭配并行计算,分布式计算就可以充分利用所有节点来完成通常要在一个节点上完成的任务。 当一个任务可以拆分成几个分散的子任务,每个子任务访问不同的分区,就可以达到提升效率的目的。
- 分区增加了系统的可用性。由于分区的副本通常是存放在不同的物理节点的。所以一旦某个分区不可用,系统依然可以调用其它副本分区来保证作业的正常运转。
2.分区方式
DolphinDB支持多种分区方式: 范围分区(RANGE),哈希分区(HASH),值分区(VALUE),列表分区(LIST),复合分区(COMPO)。
- 范围分区每个区间创建一个分区,是常用的也是推荐的一种分区方式。可以把数值在一个区间内的所有记录放置到一个分区。
- 哈希分区利用哈希函数对分区列操作,方便建立指定数量的分区。
- 值分区每个值创建一个分区,例如股票交易日期,股票交易月。
- 列表分区是根据用户枚举的列表来进行分区,比值分区更加灵活。
- 复合分区适用于数据量特别大而且查询经常涉及两个或以上的分区列。每个分区选择都可以采用区间,值或列表分区。例如按股票交易日期进行值分区, 同时按股票代码进行范围分区。
我们可以使用database函数创建数据库。
语法:database(directory, [partitionType], [partitionScheme], [locations])
参数
directory:数据库保存的目录。DolphinDB有三种类型的数据库,分别是内存数据库、磁盘上的数据库和分布式文件系统上的数据库。创建内存数据库,directory为空;创建本地数据库,directory应该是本地文件系统目录;创建分布式文件系统上的数据库,directory应该以“dfs://”开头。本教程以创建Windows本地数据库为例。
partitionType:分区方式,有5种方式: 范围分区(RANGE),哈希分区(HASH),值分区(VALUE),列表分区(LIST),复合分区(COMPO)。
partitionScheme:分区方案。各种分区方式对应的分区方案如下:
locations:指定每个分区所在的节点位置。如果是分布式文件系统的数据库或者复合分区(COMPO)类型的数据库,不能使用locations参数。
2.1 范围分区
范围分区是由分区向量决定。分区向量表示区间,包含起始值,不包含结尾值。
在下面的例子中,数据库db有两个分区:[0,5)和[5,10)。使用函数append!在数据库db中保存表t为分区表pt,并使用ID作为分区列。
n=1000000
ID=rand(10, n)
x=rand(1.0, n)
t=table(ID, x)
db=database("dfs://rangedb", RANGE, 0 5 10)
pt = db.createPartitionedTable(t, `pt, `ID)
pt.append!(t);
pt=loadTable(db,`pt)
select count(x) from pt
相关文章