建库建表
在 DolphinDB 中,创建数据库和表既可以通过 SQL 语句实现,也可以使用函数来完成。本文将分别以这两种方式进行介绍。
创建数据库
在 DolphinDB 中,数据库分为分布式数据库和内存数据库。本节将分别举例介绍他们的创建方式。
创建分布式数据库
只有具备 DB_OWNER 权限的用户才可以通过数据节点或计算节点创建分布式数据库。可通过 getUserAccess 查看当前用户是否具有该权限,如果没有,请联系管理员赋权。
若您刚刚下载 DolphinDB ,可登录默认管理员账号:
login(`admin,`123456)
DolphinDB 支持通过 CREATE DATABASE 语句和 database
函数两种方式创建数据库。下例分别使用这两种方式,创建了一个名为 “dfs://valuedb“ 的分布式数据库。其中 “dfs://“
是分布式数据库的标识;指定了分区类型为值分区;设置了 2023.01.01 到 2023.12.31 共 365 个初始分区;并指定存储引擎的类型为
TSDB。执行前须确保不存在同名数据库。
通过 CREATE DATABASE
语句:
CREATE DATABASE "dfs://valuedb"
PARTITIONED BY VALUE(2023.01.01..2023.12.31),
ENGINE="TSDB"
通过 database
函数:
valueDb = database(directory="dfs://valuedb", partitionType=VALUE,
partitionScheme=2023.01.01..2023.12.31, engine='TSDB')
两种方式的区别在于:CREATE DATABASE 语句没有返回值;database
函数会返回一个数据库句柄(dbHandle)。
关于 CREATE DATABASE 语句,细节请参见 create。
关于 database
函数,细节请参见 database。
关于数据分区:
- DolphinDB 支持 5 种分区类型 (partitionType),分别是值分区、哈希分区、范围分区、列表分区与复合分区。分区类型一经确定,不可更改。
- 数据分区方式的选择应保证每个分区的大小均匀,且大小在 100M-1G 之间。
- 同一数据库下的所有表都是采用相同的分区方案。
- 数据库分区方案 (partitionScheme) 设定后,分布式表的值分区(VALUE)允许增加分区;分布式表的范围分区 (RANGE) 允许在最后一个现有数据分区后面增加分区;其它分布类型不允许增加分区。
- 更多关于数据分区的内容请参考数据分区。
关于存储引擎(engine):DolphinDB 支持 TSDB ,OLAP,PKEY等多种存储引擎,一个数据库的存储引擎一经确定,不可修改。
类似的,若要创建组合分区数据库:
通过 CREATE DATABASE
语句
CREATE DATABASE "dfs://compodb" PARTITIONED BY VALUE(2020.01.01..2021.01.01),HASH([SYMBOL,25])
通过 database
函数
db1 = database("", VALUE, 2020.01.01..2021.01.01)
db2 = database("", HASH, [SYMBOL,25])
compoDb=database(directory="dfs://compodb", partitionType=COMPO, partitionScheme=[db1,db2])
创建内存数据库
内存数据库将数据直接存储在内存中,相较于传统的磁盘数据库,它具有更快的数据访问速度和更低的延迟。此外,在内存数据库中创建内存分区表,可对内存表进行并行处理,从而进一步提升数据处理效率。
内存数据库只支持通过函数 database
创建。当函数 database
的参数
directory 设置为空时,代表创建一个内存数据库。示例脚本如下:
mdb = database(directory="", partitionType=VALUE, partitionScheme=1..10)
创建表
DolphinDB 中,数据表分为内存表和分布式表。本节将分别举例介绍他们的创建方式。
创建内存表
DolphinDB 支持多种内存表,包括普通内存表、索引内存表、键值内存表、流数据表、mvcc 内存表、内存分区表和缓存表等,详情请见表。
通过 CREATE LOCAL TEMPORARY TABLE
语句创建普通内存表
CREATE LOCAL TEMPORARY TABLE t(
col1 INT,
col2 DOUBLE,
col3 STRING
)
通过函数 table 创建普通内存表
-
创建空表
t = table(1:0, `ool1`col2`col3, [INT,DOUBLE,STRING])
-
根据现有数据创建内存表
t = table(1 2 as col1, 1.1 2.2 as col2, `A1`B2 as col3)
通过 CREATE 语句和 table
函数创建内存表的区别在于, table
函数可以通过现有向量创建含有数据的内存表,CREATE 语句只能创建空表。
通过函数 createPartitionedTable 可以创建内存分区表
// 创建一个内存数据库
mdb = database("", VALUE, 1..10)
// 创建一个内存表
t = table(1:0,`id`sym`price`qty,[INT,SYMBOL,DOUBLE,INT])
// 根据内存表 t 的结构创建内存分区表
mpt = createPartitionedTable(dbHandle=mdb, table=t, tableName=`pt, partitionColumns=`id)
创建分布式表
只有具备 DBOBJ_CREATE 和 DB_MANAGE 权限的用户或当前数据库创建者才能够创建分布式表。可通过 getUserAccess 查看当前用户是否具有创建分区表的权限,如果没有,请联系管理员赋权。
创建分区表
通过 CREATE TABLE
语句创建 TSDB 分区表
CREATE DATABASE "dfs://valuedb" PARTITIONED BY VALUE(2023.01.01..2023.12.31),engine="TSDB"
CREATE TABLE "dfs://valuedb"."pt"(
date DATE,
time TIME,
sym SYMBOL,
price DOUBLE
)
PARTITIONED BY date,
sortColumns=`time
通过函数 createPartitionedTable 创建 TSDB 分区表
// 获取已创建的数据库句柄
valueDb = database("dfs://valuedb")
// 创建内存表 schemaTb
schemaTb = table(1:0,`date`time`sym`price,[DATE,TIME,SYMBOL,DOUBLE])
// 根据内存表 schemaTb 的结构创建 TSDB 分区表
pt = createPartitionedTable(dbHandle=valueDb, table=schemaTb, tableName=`pt,
partitionColumns=`date, sortColumns=`sym`time)
参数 sortColumns 作为 TSDB 引擎独有的参数,是 TSDB 引擎确定索引键值、进行数据排序和数据去重的根据。如果 sortColumns 只有一列,则数据会根据此列,在分区内进行分组;如果 sortColumns 具有 n(n>1)列,则数据会根据前 n-1 列进行分组。
对于组合分区的数据库,在创建分区表时,分区列个数应匹配对应的分区方案:
通过 CREATE TABLE
语句
CREATE TABLE "dfs://compodb"."pt"(
data DATE,
time TIME,
sym SYMBOL,
price DOUBLE
)
partitionColumns=`date`sym
通过 createPartitionedTable
函数
// 获取已创建的数据库句柄
compoDb = database("dfs://compodb")
// 创建内存表 schemaTb
schemaTb = table(1:0,`date`time`sym`price,[DATE,TIME,SYMBOL,DOUBLE])
// 根据内存表 schemaTb 的结构创建组合分区表
pt = createPartitionedTable(dbHandle=compoDb, table=schemaTb, tableName=`pt,
partitionColumns=`date`sym)
创建维度表
通过 CREATE TABLE
语句创建维度表
CREATE TABLE "dfs://valuedb"."dt"(
date DATE,
time TIME,
sym SYMBOL,
price DOUBLE
)
sortColumns=`sym`time
通过函数 createDimensionTable 创建维度表
// 获取已创建的数据库句柄
valueDb = database("dfs://valuedb")
// 创建内存表 schemaTb
schemaTb = table(1:0,`date`time`sym`price,[DATE,TIME,SYMBOL,DOUBLE])
// 根据内存表 schemaTb 的结构创建维度表
dt = createDimensionTable(dbHandle=valueDb, table=schemaTb,
tableName=`dt, sortColumns=`sym`time)