关于财务数据的建库问题

小白请问一下各位大神!!有没有一个性能比较好的财务数据分区方案:

情况

例如:目前我将米筐作为数据源,将从米筐获取的财务报表数据存到本地进行某些财务因子的计算,三张财报分开存进一个库。

因为财务字段可能有变化,以窄表的形式来储存。

转成窄表后,字段有这么几个:id(股票代码)、quarter(季度)、info_date(数据发布日期)、fields(财务字段名)、value(值),

id + quarter + info_date + fields 是每行数据的唯一指定。

每个季度的数据量不一致,q2、q4的数据比较多。转成窄表后,三张报表的行数平均在 50 万以上,大小平均都有 50m 左右。

使用场景

主要使用场景是按照某种方式计算财务因子,查询的时候一般根据的是 quarter(季度)+ info_date(数据发布日期),然后每天从数据源获取更新。

问题

查询和更新之间有取舍,有没有一种比较好的分区方案能够比较这种(或者优先查询,更新可以稍微牺牲)。

  1. 之前分区时没考虑更新:按照 quarter (季度) 进行分区,sortColumns 为:id、quarter、info_date,数据不去重(keepDuplicates=ALL),查询性能还不错。
  2. 现在考虑更新:希望插入数据时自动去重,按照 quarter (季度) 进行分区,sortColumns 设为:id、quarter、info_date、fields,数据去重(keepDuplicates=LAST),查询性能就不太行了。


请先 登录 后评论

2 个回答

wale

对于方案一,可以试试用upsert插入更新

请先 登录 后评论
陈无忌

您好,方案二查询性能下降的问题可以通过设置 sortKeyMappingFunction 解决。

当使用 TSDB 引擎对 sortColumn 设置多列时,除最后一列外的其余列称为 sort key,未优化的 sortColumn 设置会导致 sort key 过多,引发压缩比降低、查询性能不佳等负面效果。例如 sortColumn 为 id, quarter, info_date, fields 时,sort key 数量为 id * quarter * info_date 这三列字段的可枚举值,可能会导致单一最小分区内的索引过多,我们的建议值是少于 1000 。

因此,通过设置 sortKeyMappingFunction 来减少 sort key 数量,从而解决这个问题,希望能对您的问题有帮助。

newPt = db.createPartitionedTable(<other params>, sortKeyMappingFunction=[hashBucket{,5}])
请先 登录 后评论