如何使用简单的 table 列为庞大的价格数据规划 Timescaledb
How to plan the Timescaledb for huge price data with simple table column
我正在试用 timescaledb 来存储价格数据。价格table架构如下
CREATE TABLE prices(
time TIMESTAMPTZ NOT NULL,
pid VARCHAR(1024) NOT NULL,
price DOUBLE PRECISION NOT NULL
)
我们需要保留最多 183 天的价格数据。我们用于价格数据的当前数据库是 mongodb。我们在 mongodb 中已经有 90 亿条记录,在 183 天内插入和删除记录真的很慢。
查询非常简单。给定 pid
和日期范围,例如 7das,查询 returns 包含平均价格、最高价格和最低价格的元组。查询的RPS在20左右
此外,我们每天都会整理大约 3000 万条价格记录,这些记录将在每天凌晨 2 点左右插入 mongodb。至少需要4个小时才能完成插入。
为了这样的用例寻找并测试 timescaledb,我当然启用了 hyepertable 并将间隔块设置为 24 小时,还在 pid
上创建了一个索引。这是我目前用pythonpsycopg2.copy_from
在20分钟内完成3000万条记录的插入。想知道我在以最佳方式规划 timescaledb 时遇到的案例还有哪些其他注意事项或建议?
p.s。我确实尝试过 influxdb,但当系列基数超过一百万左右时,它并没有真正表现良好。
(时间尺度co-founder)
几点建议:
- 在
pid, timestamp desc
上创建复合索引,而不仅仅是 pid。
- 查看创建连续聚合是否有助于您的用例。例如,类似于:
- 创建视图prices_daily WITH (timescaledb.continuous) AS SELECT pid, time_bucket('1 day', time) AS bucket, min (价格) as min_price, max(price) as max_price FROM prices GROUP BY pid, bucket;
https://docs.timescale.com/latest/using-timescaledb/continuous-aggregates
- 探索使用压缩来减少存储并实现更快的长时间扫描 time-periods。特别是,鉴于您的查询通常是通过 pid,我可能会使用类似的东西:
- 更改 TABLE 价格
设置(timescaledb.compress,
timescaledb.compress_segmentby = 'pid');
https://docs.timescale.com/latest/using-timescaledb/compression
此外,欢迎您在 slack 上加入 TimescaleDB 社区来解决这些类型的问题:https://slack.timescale.com/
我正在试用 timescaledb 来存储价格数据。价格table架构如下
CREATE TABLE prices(
time TIMESTAMPTZ NOT NULL,
pid VARCHAR(1024) NOT NULL,
price DOUBLE PRECISION NOT NULL
)
我们需要保留最多 183 天的价格数据。我们用于价格数据的当前数据库是 mongodb。我们在 mongodb 中已经有 90 亿条记录,在 183 天内插入和删除记录真的很慢。
查询非常简单。给定 pid
和日期范围,例如 7das,查询 returns 包含平均价格、最高价格和最低价格的元组。查询的RPS在20左右
此外,我们每天都会整理大约 3000 万条价格记录,这些记录将在每天凌晨 2 点左右插入 mongodb。至少需要4个小时才能完成插入。
为了这样的用例寻找并测试 timescaledb,我当然启用了 hyepertable 并将间隔块设置为 24 小时,还在 pid
上创建了一个索引。这是我目前用pythonpsycopg2.copy_from
在20分钟内完成3000万条记录的插入。想知道我在以最佳方式规划 timescaledb 时遇到的案例还有哪些其他注意事项或建议?
p.s。我确实尝试过 influxdb,但当系列基数超过一百万左右时,它并没有真正表现良好。
(时间尺度co-founder)
几点建议:
- 在
pid, timestamp desc
上创建复合索引,而不仅仅是 pid。
- 查看创建连续聚合是否有助于您的用例。例如,类似于:
- 创建视图prices_daily WITH (timescaledb.continuous) AS SELECT pid, time_bucket('1 day', time) AS bucket, min (价格) as min_price, max(price) as max_price FROM prices GROUP BY pid, bucket;
https://docs.timescale.com/latest/using-timescaledb/continuous-aggregates
- 探索使用压缩来减少存储并实现更快的长时间扫描 time-periods。特别是,鉴于您的查询通常是通过 pid,我可能会使用类似的东西:
- 更改 TABLE 价格 设置(timescaledb.compress, timescaledb.compress_segmentby = 'pid');
https://docs.timescale.com/latest/using-timescaledb/compression
此外,欢迎您在 slack 上加入 TimescaleDB 社区来解决这些类型的问题:https://slack.timescale.com/