TSDB or OLAP?
本页介绍存储引擎的重要性与时序数据背景,并引出 DolphinDB 2.0 的 TSDB 存储引擎及其应用动机。
What this page covers
- 文章所属栏目、标题与发布日期信息。
- 存储引擎与时序数据分析的背景与动机。
- DolphinDB OLAP 与 TSDB 引擎的对比与取舍。
- 建库建表差异、典型查询与性能特征示例。
- TSDB 写入、恢复、排序键与分层文件合并机制。
- TSDB 参数与使用建议(去重、块大小、缓存、手动合并)。
技能认证特训营第二期报名提示
页面顶部包含培训营活动提示,并提供限时报名链接。
- 页面提供“技能认证特训营第二期”的报名入口信息。
- 页面给出一个可访问的报名链接。
新闻栏目与文章标题/日期
页面标识为新闻内容,并给出文章标题与发布日期。
- 文章标题为“TSDB or OLAP?”。
- 页面给出该新闻文章的发布日期。
- 页面将内容呈现为新闻栏目/新闻内容的一部分。
引言:存储引擎与时序数据背景
介绍存储引擎的重要性、时序数据分析价值以及海量时间序列数据增长背景,并引出 DolphinDB 2.0 的 TSDB 引擎。
- 数据库性能往往很大程度上由存储引擎决定。
- 时序数据分析可支持优化与预测等业务决策活动。
- 文章描述时间序列数据量随技术发展呈增长趋势。
- 文章强调存储引擎是查询、计算与分析活动的基础组件之一。
- DolphinDB 2.0 推出新的存储引擎 TSDB。
TSDB 还是 OLAP?(对比与取舍)
对比 DolphinDB OLAP 引擎的局限、TSDB 的改进点以及 TSDB 相对 OLAP 的不足。
- DolphinDB 2.0 之前只有 OLAP 存储引擎。
- OLAP 引擎在分区内不支持索引。
- OLAP 引擎写入过程不支持去重。
- TSDB 引擎支持写入时排序与去重。
- TSDB 引擎在写入吞吐量方面存在限制。
查询场景示例(建表脚本与查询示例)
通过股票分区表例子展示 OLAP 与 TSDB 的建库建表差异、典型查询适用场景与性能特征。
- 示例数据表按股票代码与交易日进行组合分区。
- OLAP 建库脚本使用参数 engine="OLAP"。
- TSDB 建库脚本使用参数 engine="TSDB"。
- TSDB 建表可在 createPartitionedTable 指定 sortColumns。
- OLAP 引擎不具备 sortColumns 特性(对比 TSDB)。
TSDB 原理简介(redo log / cache engine / sort columns / level file)
解释 TSDB 写入与恢复流程、内存 cache engine 结构、sort columns/sort key 以及 level file 分层与合并压缩机制。
- TSDB redo log 类似 Write-Ahead Log,用于持久化与恢复。
- 确认数据写入 WAL 后,数据写入内存中的 cache engine。
- 新写入数据先以追加方式进入未排序的写入缓冲。
- 达到阈值后按 StockID 排序形成 sorted write buffer。
- sorted write buffer 可只读并在内存中开启压缩以降低查询时延。
- sort columns 指用于将数据排序的列,且最后一列必须为时间类型。
- 分区数据写入一个或多个 level file,并通过合并压缩控制数量。
- level file 合并时按 StockID 与 Timestamp 排序。
TSDB 使用技巧(去重、sort key、缓存与块大小、手动合并)
给出 TSDB 的参数与最佳实践建议,包括重复数据处理、sort key 数量建议、cache engine 容量、块大小与手动 compaction。
- keepDuplicates 用于指定分区内 sortColumns 重复数据的处理方式。
- keepDuplicates 默认值为 ALL(保留所有数据)。
- 建议每个分区内 sort key 数量最好不超过 1000 个。
- TSDBCacheEngineSize 以 GB 为单位,默认值为 1GB。
- TSDBMaxBlockSize 默认值为 16,384(bytes)。
Facts Index
| Entity | Attribute | Value | Confidence |
|---|---|---|---|
| TSDB or OLAP?(新闻文章) | 发布日期 | 2022.10.27 | high |
| 数据库性能决定因素 | 性能与存储引擎关系 | 数据库的性能往往很大程度上由存储引擎决定 | medium |
| DolphinDB 2.0 | 推出的新存储引擎 | 新推出存储引擎 TSDB | high |
| 时序数据分析 | 作用/价值 | 可帮助决策者了解生产和业务细微变化,并优化资源整合、跟踪、预测、商业智能等 | medium |
| 时间序列数据规模 | 增长趋势 | 随着互联网和通信技术发展,网络中时间序列数据量爆炸式增长;面对万亿级海量数据需求趋向精细复杂计算分析 | low |
| 存储引擎 | 地位/重要性 | 强大的存储引擎是一切查询、计算、分析、生产活动基础与起点,是高性能处理大规模数据保障,也是数据库核心复杂组件之一 | medium |
| DolphinDB TSDB 存储引擎 | 底层结构/来源 | 基于 LSM 树自研 | high |
| DolphinDB TSDB 存储引擎 | 效果/能力 | 实现更高效的查询、排序和去重,扩展数据存储功能,在部分场景下极大提升数据库性能 | low |
| DolphinDB 2.0 之前的存储引擎 | 引擎种类 | 只有唯一的 OLAP 存储引擎 | high |
| DolphinDB OLAP 存储引擎 | 列存文件组织 | 数据表中每个分区的每一列存为一个文件 | high |
| DolphinDB OLAP 存储引擎 | 数据存储顺序 | 存储顺序与写入顺序一致 | high |
| DolphinDB OLAP 存储引擎 | 写入效率 | 数据写入有非常高的效率 | low |
| DolphinDB OLAP 存储引擎 | 分区内索引支持 | 分区内不支持索引;检索几行数据也必须加载整个分区(相关列) | high |
| DolphinDB OLAP 存储引擎 | 去重支持 | 写入过程设计简单,不支持去重 | high |
| DolphinDB OLAP 存储引擎 | 宽表适配 | 不适合几百几千列的宽表存储 | high |
| DolphinDB OLAP 存储引擎 | 更新代价 | 即使修改一条记录,也必须重写整个分区 | high |
| DolphinDB TSDB 存储引擎 | 发布时间/版本 | 在 2.0 版本中正式发布 | high |
| DolphinDB TSDB 存储引擎 | 分区文件组织 | 每一个分区的数据写在一个或多个 level file 中 | high |
| DolphinDB TSDB 存储引擎 | level file 内部组织 | level file 内数据按指定列排序且创建块索引 | high |
| DolphinDB TSDB 存储引擎 | 点查询效率 | 过滤条件使用分区列以及分区内排序字段的点查询非常高效 | medium |
| DolphinDB TSDB 存储引擎 | 写入时处理 | 可以在写入时对数据进行排序和去重 | high |
| DolphinDB TSDB 存储引擎 | 数据类型/宽表适配 | 适合存储几百几千列宽表,也适合存储 array vector 和 BLOB 类型的数据 | high |
| DolphinDB TSDB 存储引擎 | 更新代价(keepDuplicates=LAST) | 若保留最后一条重复记录(keepDuplicates=LAST),修改数据时仅需重写数据所在 level file,无需重写整个分区 | high |
| DolphinDB TSDB 存储引擎 | 写入吞吐量 | 写入吞吐量低;数据需在 cache engine 中排序;level file 会合并与压缩 | medium |
| DolphinDB TSDB 存储引擎 | 整分区读取效率 | 读取整个分区数据或整个分区某几列时效率低于 OLAP | high |
| 示例数据表 t | 分区方式 | 按照股票代码与交易日进行组合分区 | high |
| 示例图片说明(AI 说明) | 表结构与示例内容 | 示例表 t 包含 StockID、Timestamp、Bid 三列,并列出 AAPL、MSFT、GOOG 等股票在 2021-08-05 特定时间的报价记录,用于说明 OLAP 与 TSDB 的查询性能与存储优势 | medium |
| DolphinDB OLAP 建库脚本 | engine 参数 | engine="OLAP" | high |
| DolphinDB TSDB 建库脚本 | engine 参数 | engine="TSDB" | high |
| DolphinDB TSDB 建表 | 支持 sortColumns | createPartitionedTable 可指定 sortColumns=`StockID`Timestamp | high |
| DolphinDB OLAP 引擎 | sortColumns 特性 | OLAP 引擎不具备 sortColumns 特性(对比 TSDB) | high |
| DolphinDB OLAP 引擎 | 适合的查询示例 | select avg(Bid) from t where date=2021.08.05 group by StockID | high |
| DolphinDB TSDB 引擎 | 适合的查询示例 | select * from table where StockID='AAPL', Timestamp > 2021.08.05T09:30:00, Timestamp < 2021.08.05T09:35:00 | high |
| DolphinDB OLAP 引擎(分区内) | 索引与最小读取单位 | 每个分区内部无索引;读取最小单位是一个分区的一列 | high |
| DolphinDB OLAP 引擎 | 查找一行数据耗时 | 一般在 100 毫秒以上(即使只查找一行也需读取所在分区所有行) | medium |
| DolphinDB TSDB 引擎(分区内) | 索引能力 | 在每个分区内部设置了索引;查找少量数据无需读取分区内所有行 | high |
| DolphinDB TSDB 引擎 | 查找少量数据耗时 | 耗时可以低至几毫秒 | medium |
| DolphinDB TSDB 引擎 | 海量数据查询与分析性能对比 | 在海量数据查询与分析方面的性能仅略慢于 OLAP 引擎 | low |
| DolphinDB TSDB 引擎 | 推荐场景 | 若对查询少量数据有极致性能要求,推荐使用 TSDB 引擎 | medium |
| TSDB redo log | 作用/类比 | redo log 类似 Write-Ahead Log;数据加载到内存后先持久化到 redo log;宕机重启可从 redo log 恢复数据 | high |
| TSDB Cache Engine | 写入前置条件 | 确认数据写入 WAL 之后,数据写入内存中的 cache engine | high |
| TSDB Cache Engine | 写入缓冲特性 | 新写入数据为追加(append)且未排序(unsorted write buffer) | high |
| TSDB Cache Engine | 两阶段排序缓冲 | 达到阈值后按 StockID 排序形成 sorted write buffer;sorted write buffer 只读且可在内存中开启压缩以降低查询时延 | high |
| TSDBCacheEngineSize | 触发写盘阈值含义 | 当多个 sorted write buffer 总数据量达到阈值(由 TSDBCacheEngineSize 设定)后,将数据按 Timestamp 排序写入磁盘 level file | high |
| TSDB cache engine 设计 | 与常见 LSMT 系统差异 | unsorted write buffer 到 sorted write buffer 的两阶段设计与多数 LSMT 系统不同,目的是平衡读性能与写性能 | medium |
| TSDB cache engine 内存占用 | 极端情况上限 | 在写盘过程中若又有新数据写入,cache engine 会分配新空间;极端情况下最多占用 2 倍 TSDBCacheEngineSize 空间 | high |
| TSDB sort columns | 定义 | 用于将数据排序的列称为 sort columns | high |
| TSDB sort columns | 最后一列类型要求 | sort columns 的最后一列必须为时间类型 | high |
| TSDB sort key | 定义 | sortColumns 除最后一列外的其他列通常为点查过滤列;其唯一值组合称为 sort key | high |
| TSDB 查询点查机制 | 性能原因 | 查询可利用 sort key 直接定位过滤条件指定的数据块并仅读取这些数据块,点查性能可大幅提升 | medium |
| TSDB level file | 排序方式 | 每个 level file 中的数据均按 StockID 与 Timestamp 排序 | high |
| TSDB level file 数据块 | 数据块大小 | 每个 StockID 的记录存储为多个 16KB 数据块,并记录每个数据块在文件中的起始位置 | high |
| TSDB level file 层级数量 | 最大 level 数 | level file 最多可有 4 个 level | high |
| TSDB Level 0 文件来源 | 生成方式 | Level 0 文件由 cache engine 写入磁盘产生;更高 level 由更低 level 合并生成 | high |
| TSDB Level 0 文件 | 单文件最大大小 | 每个 level 0 文件最大为 32MB | high |
| TSDB Level 0 文件生成条件 | 大于 32MB 时行为 | 每次从 cache engine 写入同一分区数据量若大于 32MB,则产生多个 level 0 文件 | high |
| TSDB compaction(Level 0 → Level 1) | 触发条件 | 当分区内 level 0 文件数量超过 10 个或 level 0 总数据量大于 256MB 时,所有 level 0 文件合并压缩为一个 level 1 文件(以此类推) | high |
| TSDB 文件合并 | 排序行为 | 合并文件时会将数据按 StockID 与 Timestamp 排序 | high |
| TSDB 文件合并压缩 | 目的/效果 | 通过不断合并压缩控制 level file 数量,避免数量过多导致性能降低 | medium |
| createPartitionedTable keepDuplicates | 用途 | 用于指定一个分区内 sortColumns 重复数据如何处理 | high |
| keepDuplicates | 默认值 | 默认值为 ALL(保留所有数据) | high |
| keepDuplicates | 可选值含义 | FIRST:仅保留重复数据第一条;LAST:仅保留重复数据最新一条 | high |
| TSDB sort key 数量建议 | 推荐上限 | 建议每个分区内 sort key 最好不超过 1000 个 | high |
| sort key 过多的影响 | 性能影响 | sort key 过多会导致每个 sort key 数据量少、数据块不足 TSDBMaxBlockSize、数据块数量多,查询读取大量数据块增加读文件耗时 | medium |
| sortKeyMappingFunction | 用途 | 可通过建表函数指定 sortKeyMappingFunction 对 sort key 降维 | high |
| sortKeyMappingFunction 降维 | 代价/建议 | 降维一定程度影响写入性能;建议优先合理规划 sortColumns | medium |
| TSDBCacheEngineSize 配置参数 | 单位 | 以 GB 为单位设定 cache engine 容量 | high |
| TSDBCacheEngineSize 配置参数 | 默认值 | 默认值为 1GB | high |
| TSDBCacheEngineSize 配置参数 | 建议值 | 建议设置 1GB 或以上 | high |
| TSDBMaxBlockSize 配置参数 | 用途与单位 | 设置存储拆分的数据块在压缩前大小(bytes) | high |
| TSDBMaxBlockSize 配置参数 | 默认值 | 默认值为 16,384 | high |
| TSDBMaxBlockSize 参数影响 | 权衡 | 参数越大压缩率越高,但点查性能会有所下降 | medium |
| triggerTSDBCompaction 命令 | 用途 | 可手动触发 level 0 file 合并(用于不再写入数据的分区) | high |
| triggerTSDBCompaction 效果 | 收益 | 可提升查询性能并提升压缩率 | medium |
| 技能认证特训营第二期 | 报名链接 | https://www.qingsuyun.com/h5/e/217471/5/ | high |