DolphinDB 2.0 如何设计数据库以实现查询最优化?

对于一个level 2或level 1的行情数据库,如何能够快速查询某一个股票某一时间范围内的全部数据?如果使用DolphinDB 2.0的话,应该怎么设计分区数据库,使得查询性能达到最佳?

请先 登录 后评论

1 个回答

jiajia xu

对于2.0引擎,指定databse参数为engine = “TSDB”。TSDB引擎专为时序数据设计,十分适用于时间相关、单点查询的场景。查询可以不以分区为单位,只查询某一个sort column列的某个取值对应的数据,例如查询某个设备id在某个时间段内的全部数据。因此该场景非常适用TSDB引擎进行建库,以便于提升后续的查询性能。

分区:对于不同level的数据,由于数据量大小不同,为保证最佳性能,尽量将数据均匀分区。合理分区的原则:将每个表的每个分区的数据量控制在压缩前100M左右。

针对行情数据,通常可用时间和产品标识两个维度来进行分区。这里对股票和时间字段采用组合分区。

为保证合理的分区粒度:

  • 股票字段:

    • 股票数据较为均匀:可以采用哈希分区,随着数据量的增大,哈希分区有利于维护各个分区粒度均匀,拓展性较好。

    • 不同股票字段数据量差异大:可以考虑采用范围分区,将股票字段划分成多个范围,使得每一个范围内的产品的数据总量比较均衡。

  • 时间字段:

    • 值分区:通过在配置项里设置newValuePartitionPolicy=add,对于新增数据,系统可以自动增加分区,因此分区拓展性好。根据数据自身的时间和查询的时间粒度,可以指定值分区的粒度,如按小时/天/月等。

创建分区表:以股票和时间字段作为sortColumns

DolphinDB 2.0设计了加快分区内部检索的sort key,属于同一个key的数据按序连续地存储在分区内部。对于频繁查询或者数据较多的字段适合设置为sortColumns. 查询时,sortColumns作为索引入口,可以定位数据所在的文件位置,提高查询性能。且当sortColumns设置为多列,建议最后一列为时间相关列。

SQL查询:查询中用where语句指定sortColumns作为查询字段可以提高查询性能。因此这里用股票代码和查询的时间作为条件范围,且条件之间建议以 ”,”连接,先锁定对应股票的分区,然后筛选对应时间范围的数据。和"and"连接不同,“,”对于数据的筛选是按照条件顺序筛选的,而“and"则是将每个条件筛选的结果取交集。更多查询优化还可以参考用户手册:查询数据

更多相关案例可以参考: DolphinDB入门:量化金融范例国内股票行情数据导入实例


请先 登录 后评论