对从交易所拿到的行情文件, 存储分区是否有较优方案

请先 登录 后评论

1 个回答

Boye

DolphinDB目前支持OLAP引擎和TSDB引擎,2个引擎引擎均采用数据分区技术,按照给定规则将大规模数据集水平分区,每个分区内的数据采用列式存储。

OLAP 数据表的每个列存储为一个文件,数据以追加的方式存储到相应的列文件中,因此,数据写入的顺序决定了它们的存储顺序。

TSDB 采用经典的 LSMT (Log Structured Merge Tree) 模型,引入了排序列(sortColumns:最后一列为时间列,其他列组合为 sortKey)。 在用户查询某个或少数几个设备(股票)在特定时间段数据的场景下,可以通过将设备(股票)标识、时间等列作为 TSDB 引擎的 sortColumns,以提升查询性能。

OLAP 引擎将每列数据存储为一个列文件,所以读取数据时,需要从磁盘读取该列所在的分区,解压后加载到内存。这种数据读取方式使得 OLAP 引擎在高吞吐量查询情况下拥有较好的性能。 但若需要更新或删除某条数据,OLAP 会将整个分区数据加载到内存中,再对这条数据进行更新或删除,因此性能开销大。

查询数据时,TSDB 引擎会将查询数据分区内 level file 的索引部分加载内存,然后根据索引,定位数据块的位置。因此若查询语句中按 sortKey 顺序指定过滤条件,可以快速定位到数据所在的位置。

因此这种数据读取方式,非常适合单点查询,因为单点查询可以通过索引快速定位到对应的文件,且只需要加载对应数据块到内存,无需加载整个分区,所以查询性能极优。 但注意,数据量过大可能导致 level file 数量较多,此时TSDB 的单点查询效率就会降低。

OLAP 引擎主要应用场景:

  • 需要高吞吐量查询;

  • 需要扫描分析大量数据,全表扫描等场景,如:查询所有股票在某个时间段内的交易量等。

OLAP 引擎不适合以下场景:

  • 需要存储多列,比如列数超过1000个;

  • 查询某个 key (设备或股票)在某个时间点或时间段的数据。

TSDB 引擎相较于 OLAP 引擎无上述限制,尤其适合以下场景:

  • 单点查询,如查询某个或某几个设备(股票)在给定某个时间段内的数据;

  • 需要对数据进行去重存储;

  • 支持存储数组向量(array vector)。


因此,请根据常用查询选择OLAP或TSDB引擎,若选择OLAP引擎,请参考教程:

https://gitee.com/dolphindb/Tutorials_CN/blob/master/stockdata_csv_import_demo.md#2-%E5%BB%BA%E5%BA%93%E5%BB%BA%E8%A1%A8

若选择TSDB引擎,请参考教程:

best_practice_for_factor_calculation.md · dolphindb/Tutorials_CN - Gitee.com

请先 登录 后评论
  • 1 关注
  • 0 收藏,723 浏览
  • sparksfly_yang 提出于 2022-08-11 18:03

相似问题