我正在为 Database CrateDB 建模。
我有一个平均值。400 个客户,每天产生不同数量的时间序列数据。(介于 5K 和 500K 之间;平均约为 15K)
稍后我应该能够查询每个 customer_year_month 和每个 customer_year_calendar_week。这意味着我只会查询间隔:
- 星期
- 和月份
现在我问自己如何分区这个表?
我会按客户和年份进行分配。
这有意义吗?还是按客户、年份和月份划分
会更好?
所以分区表的问题是相当复杂的,应该考虑很多事情。其中:
从本质上讲,每个分区还通过乘以分片计数(一个分区可以被认为是基于列值的“子表”)来产生开销,如果选择不当 - 会严重影响性能。因此,在您的情况下,每天 15k 插入并不算多,但是插入的分布可能会导致问题,每天以 500k 插入增长的客户分区将比 5k 人更早遇到性能问题。因此,我只会使用每周分区。
create table "customer-logging" (
customer_id long,
log string,
ts timestamp,
week as date_trunc('week', ts)
) partitioned by (week) into 8 shards
如果您有适当数量的 CPU 内核,请仅使用 8 个分片;)
文档:date_trunc(),分区表
理想情况下,您尝试几种不同的组合并找到最适合您的组合。我们的系统表提供了对分片大小和位置的洞察,因此您可以查看是否有一个特别胖的分片使节点过载;)
干杯,克劳斯