Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
byte marker;
varInt data_size;
String measurementID; // can remove
byte datatype;
byte compressionType;
byte encoding type

...

观察可知三者的header并不冲突,合并并不能节省空间综上所述,目前的tsfile对于单chunk单page已经做了元数据去冗余的优化,本设计没必要合并Page和Chunk,Timeseries metadata中保存了一份的measurement ID信息,Timeseries index tree是一个稀疏索引,没有保存全量measurement ID,所以不可以删除


综上所述,目前的tsfile对于单chunk单page已经做了元数据去冗余的优化,本设计没必要合并Page和Chunk,ChunkHeader中保存了一份的measurement ID信息,而TimeseriesMetadata中保存了measurement ID,存在冗余,可以删除,需要修改TsFileSequenceReader中如下接口:

Code Block
// old interface
private ChunkHeader readChunkHeader(long position, int chunkHeaderSize);

// new interface
private ChunkHeader readChunkHeader(long position, int chunkHeaderSize, String measurementID)


去除统计信息

Statistic

增加一个byte标识,标记其是否含有统计信息块,进而决定序列化和反序列化的方式

TsfileResource

增加一个byte标识,标记其是否含有统计信息块

查询适配

修改StorageGroupProcessor中的getFileResourceListForQuery方法,对于无统计信息的Tsfile生成一个特殊的TsfileResource,在loadChunk时自动生成统计信息块,进而复用原有查询代码


优缺点分析:

优点

(1)节省存储空间,每序列10个点的情况下,移除统计信息大约能节省28%的空间;每序列1个点的情况下,移除统计信息大约能节省45%的空间

(2)提高写入性能:写入性能约提高5-10%

缺点

(1)查询无法使用统计信息进行过滤和加速聚合修改StorageGroupProcessor中的getFileResourceListForQuery方法,对于无统计信息的Tsfile生成一个特殊的TsfileResource


实验

实验场景

模拟海量时间序列一次刷盘1%的数据量,即100万时间序列,其中有1万个设备,每个设备下有100个工况,每条时间序列写10个点,生成tsfile

每条时间序列的类型为long,编码算法为RLE,压缩算法为SNAPPY

试试GZIP每条时间序列的类型为long,编码算法为RLE,压缩算法为SNAPPY或GZIP

去除统计信息前后文件大小比较

每序列10个点(SNAPPY)

...