diff --git a/best_practice_for_factor_calculation.md b/best_practice_for_factor_calculation.md index feb5620f2ab937ffc41d7cc9bfe41c069b2e60cb..cedb994f9cbfcef4b2664c7e666a6d595c6d3c42 100644 --- a/best_practice_for_factor_calculation.md +++ b/best_practice_for_factor_calculation.md @@ -553,9 +553,9 @@ demoEngine = createReactiveStateEngine(name="reactiveDemo", metrics=<[TradeTime, 结合以上考虑因素,我们以4000只股票,1000个因子,存储分钟级因子库为例,我们有如下三种选择: -* 以纵表存储,使用OLAP引擎,每行按时间存储一只股票一个因子数据,分区方案 VALUE(天)+ HASH(因子名,125)。 -* 以纵表存储,使用TSDB引擎,每行按时间存储一只股票一个因子数据,分区方案 VALUE(月)+ HASH(因子名,50), 按股票代码+时间排序。 -* 以宽表存储,使用TSDB引擎,每行按时间存储全部股票一个因子,或者一支股票全部因子数据,分区方案VALUE(月)+ HASH(因子名,20),按因子名+时间排序。 +* 以纵表存储,使用OLAP引擎,每行按时间存储一只股票一个因子数据,分区方案 VALUE(月)+ VALUE(因子名)。 +* 以纵表存储,使用TSDB引擎,每行按时间存储一只股票一个因子数据,分区方案 VALUE(月)+ VALUE(因子名), 按股票代码+时间排序。 +* 以宽表存储,使用TSDB引擎,每行按时间存储全部股票一个因子,或者一支股票全部因子数据,分区方案VALUE(月)+ VALUE(因子名),按因子名+时间排序。 OLAP引擎是纯列式存储,不适合表过宽,在列数超过80以后,写入性能会逐渐下降,故不做考虑。 @@ -583,13 +583,13 @@ OLAP引擎是纯列式存储,不适合表过宽,在列数超过80以后, | 横纵方式 | 数据引擎 | 数据总行数 | 单行字节 | 数据大小(GB) | 数据落盘大小(GB) | 压缩比 | 写入磁盘耗时 | IO峰值(m/s) | | :-----:| :----: | ----: |----: |----: |----: |----: |----: |----: | -| 纵表| OLAP| 1,294,280,000 | 24 |28.9 |9.0 |0.31 |188 |430 | -| 纵表| TSDB| 1,294,280,000 | 24 |28.9 |14.0 |0.48 |226 |430 | -| 宽表| TSDB| 323,570|32,012 |9.6|8.9 |0.92 |44 |430 | +| 纵表| OLAP| 1,268,080,000 | 24 |28.34 |9.62 |0.34 |150 |430 | +| 纵表| TSDB| 1,268,080,000 | 24 |28.34 |9.03 |0.32 |226 |430 | +| 宽表| TSDB| 317,020|32,012 |9.45|8.50 |0.90 |38 |430 | -从比对结果来看,宽表 TSDB 模式的写入速度是纵表 OLAP 的4倍,纵表 TSDB 的5倍,存储空间上宽表 TSDB 和 OLAP 纵表相近,均约为 TSDB 纵表的三分之二,压缩比上纵表 OLAP 最优,纵表 TSDB 次之,宽表 TSDB 最差。这是因为首先实际产生的数据字节上,纵表模式是宽表模式的三倍,这决定了宽表 TSDB 的的写入速度最优,磁盘使用空间最优,也导致了宽表 TSDB 模式的压缩比会相对差一些,另外模拟数据随机性很多大,也影响了 TSDB 引擎宽表得数据压缩;其次 TSDB 引擎会进行数据排序,生成索引,所以同样是纵表,TSDB 引擎在存储空间、存储速度、压缩比方面都要略逊于 OLAP 引擎。 +从比对结果来看,宽表 TSDB 模式的写入速度是纵表 OLAP 的4倍,纵表 TSDB 的5倍,存储空间上 OLAP 纵表和 TSDB 纵表相近,TSDB 宽表略小于前二者,压缩比上纵表 TSDB 最优,纵表 OLAP 次之,宽表 TSDB 最差。这是因为首先实际产生的数据字节上,纵表模式是宽表模式的三倍,这决定了宽表 TSDB 的的写入速度最优,磁盘使用空间最优,也导致了宽表 TSDB 模式的压缩比会相对差一些,另外模拟数据随机性很多大,也影响了 TSDB 引擎宽表得数据压缩;其次 TSDB 引擎会进行数据排序,生成索引,所以同样是纵表,TSDB 引擎在存储空间、存储速度、压缩比方面都要略逊于 OLAP 引擎。 -具体存储脚本参考[因子数据存储模拟脚本](script/factorPractice/appendix_5.1_factorDataSimulation.zip)。 +具体存储脚本参考[因子数据存储模拟脚本](../script/factorPractice/appendix_5.1_factorDataSimulation.zip)。 ### 5.2 因子查询 @@ -597,30 +597,30 @@ OLAP引擎是纯列式存储,不适合表过宽,在列数超过80以后, | 横纵方式 | 数据引擎 |股票数 | 因子数 | 时间跨度 | 数据级别 | 数据总行数|每行字节 | 数据大小(GB) | 数据分区 | | :-----:| :----: | ----: |----: |:----: |:----: |----: |----: |----: |:----: | -| 纵表| OLAP| 4000 | 200 |一年 |分钟级|51,771,200,000 |24 |1157.2 |日(VALUE分区)+因子(HASH分区)| -| 纵表| TSDB| 4000 | 200 |一年 |分钟级|51,771,200,000 |24 |1157.2 |月(VALUE分区)+因子(HASH分区)| -| 宽表| TSDB| 4000 | 200 |一年 |分钟级| 12,942,800 |32012 |385.8 |月(VALUE分区)+因子(HASH分区)| +| 纵表| OLAP| 4000 | 200 |一年 |分钟级|50,723,200,000 |24 |1133.75 |日(VALUE分区)+因子(VALUE分区)| +| 纵表| TSDB| 4000 | 200 |一年 |分钟级|50,723,200,000 |24 |1133.75 |月(VALUE分区)+因子(VALUE分区)| +| 宽表| TSDB| 4000 | 200 |一年 |分钟级| 12,680,800 |32012 |340.19 |月(VALUE分区)+因子(VALUE分区)| -下面我们通过多个角度的查询测试来比对这三种存储方式的查询性能。[因子查询测试脚本](script/factorPractice/appendix_5.2_factorQueryTest.dos) +下面我们通过多个角度的查询测试来比对这三种存储方式的查询性能。[因子查询测试脚本](../script/factorPractice/appendix_5.2_factorQueryTest.dos) * 查询1个因子1只股票指定时间点数据 | 横纵方式 | 数据引擎 |查询行数 | 字节数 | 耗时(ms) | | :-----:| :----: | ----: |----: |----: | -| 纵表| OLAP| 1 | 24 |143.2| -| 纵表| TSDB| 1 | 24 |13.2| -| 宽表| TSDB| 1 | 20 |2.5| +| 纵表| OLAP| 1 | 24 |1100| +| 纵表| TSDB| 1 | 24 |6| +| 宽表| TSDB| 1 | 20 |2| 在点查询上TSDB引擎优势明显,而宽表TSDB因为数据行数少,速度上还要快于纵表TSDB模式。 * 查询1个因子1只股票一年分钟级数据 -| 横纵方式 | 数据引擎 |数据大小(MB) | 耗时(ms) | +| 横纵方式 | 数据引擎 |数据大小(MB) | 耗时(s) | | :-----:| :----: | ----: |----: | -| 纵表| OLAP| 1 |12,000| -| 纵表| TSDB| 1 |42| -| 宽表| TSDB| 1 |24| +| 纵表| OLAP| 1.5 |0.9| +| 纵表| TSDB| 1.5 |0.03| +| 宽表| TSDB| 1.2 |0.02| 查询单因子单股票一年的分钟级数据宽表TSDB引擎速度最快,这是因为TSDB引擎分区较大,读取的文件少,且数据有排序,而OLAP引擎本身数据分区较小,需要扫描的行数又同样不少,所以速度最慢。 @@ -629,9 +629,9 @@ OLAP引擎是纯列式存储,不适合表过宽,在列数超过80以后, | 横纵方式 | 数据引擎 |数据大小(GB) | 耗时(s) | | :-----:| :----: | ----: |----: | -| 纵表| OLAP| 5.8 |7.7| -| 纵表| TSDB| 5.8 |11.2| -| 宽表| TSDB| 1.9 |3.7| +| 纵表| OLAP| 5.7 |8.9| +| 纵表| TSDB| 5.7 |12.4| +| 宽表| TSDB| 1.9 |3.8| 宽表TSDB读取速度最快,读取的总数据量比较大时,这几种模式都会读取很多完整分区,而宽表TSDB模式因为实际数据比较小,所以速度上是纵表OLAP的一半,是纵表TSDB的三分之一略多。 @@ -640,9 +640,9 @@ OLAP引擎是纯列式存储,不适合表过宽,在列数超过80以后, | 横纵方式 | 数据引擎 |数据大小(GB) | 耗时(s) | | :-----:| :----: | ----: |----: | -| 纵表| OLAP| 17.4 |15.6| -| 纵表| TSDB| 17.4 |21.5| -| 宽表| TSDB| 5.8 |11.9| +| 纵表| OLAP| 17.0 |17.7| +| 纵表| TSDB| 17.0 |25.9| +| 宽表| TSDB| 5.7 |10.7| 更大数据量的数据读取,查询耗时线性增长,同样原因,宽表TSDB读取速度仍然最快。 @@ -658,11 +658,11 @@ tsdb_symbol_all=select * from tsdb_min_factor where symbol=`sz000056 select mtime,factorname,sz000001 from tsdb_wide_min_factor ``` -| 横纵方式 | 数据引擎 |数据大小(MB) | 耗时 | +| 横纵方式 | 数据引擎 |数据大小(MB) | 耗时(s) | | :-----:| :----: | ----: |----: | -| 纵表| OLAP| 289 |10m 25s| -| 纵表| TSDB| 289 |1.2s| -| 宽表| TSDB| 260 |1.8s| +| 纵表| OLAP| 312 |10分钟以上 中止| +| 纵表| TSDB| 312 |1.5s| +| 宽表| TSDB| 260 |0.5s| 以上结果可以看到,宽表 TSDB 引擎和纵表 TSDB 都可以很快的查出数据,而纵表模式 OLAP 则需要百倍以上的时间才能查询出数据。这是因为纵表模式 OLAP 的分区字段是时间和因子,这种情况下查询某只股票所有的因子需要扫描全部分区的全部列才能取出所需的数据;而宽表TSDB引擎只需要取三列数据,所以可以很快查出数据;纵表TSDB引擎可以按股票代码进行索引检索所以速度也比较快。 @@ -681,9 +681,9 @@ wide_tsdb_factor_year=select * from tsdb_wide_min_factor where factorname =`f000 ``` | 横纵方式 | 数据引擎 |数据大小(GB) | 耗时(s) | | :-----:| :----: | ----: |----: | -| 纵表| OLAP| 5.8 |48.5| -| 纵表| TSDB| 5.8 |49.5| -| 宽表| TSDB| 1.9 |3.7| +| 纵表| OLAP| 1.9 |41.2| +| 纵表| TSDB| 1.9 |32.9| +| 宽表| TSDB| 1.9 |3.3| 宽表 TSDB 模式查询面板数据时的速度是纵表 OLAP 和纵表 TSDB 的十倍以上,这是因为宽表 TSDB 的数据本身就以类似面板数据的方式存储,不需要再转换为面板数据,而纵表模式无论 OLAP 引擎还是 TSDB 引擎查询出数据后还要使用 pivot by 进行列转行操作,这个命令要进行数据比对去重、排序等操作,所以会耗费一些时间,在数据量大时,耗时明显,所以速度会大幅幅度落后于宽表 TSDB 模式。 @@ -696,9 +696,9 @@ wide_tsdb_factor_year=select * from tsdb_wide_min_factor where factorname in ('f ``` | 横纵方式 | 数据引擎 |数据大小(GB) | 耗时(s) | | :-----:| :----: | ----: |----: | -| 纵表| OLAP| 17.4 |10分钟以上 中止| -| 纵表| TSDB| 17.4 |10分钟以上 中止| -| 宽表| TSDB| 5.8 |9.3| +| 纵表| OLAP| 5.7 |10分钟以上 中止| +| 纵表| TSDB| 5.7 |10分钟以上 中止| +| 宽表| TSDB| 5.7 |9.5| 宽表 TSDB 引擎具有最佳的查询性能,随着数据量上升,纵表数据列转行操作要额外增加 piovt by 的列,从而增加更多的去重、排序操作,导致生成面板数据的耗时进一步增加。