您能帮我理解我在本文档中阅读的内容吗? https://crate.io/docs/reference/sql/partitioned_tables.html
在这些示例表中,列id long
不是primary_key
; 实际上,id
这里不能是主键,因为如下所述“如果设置了主键,则它必须存在于PARTITION BY
子句中”
在我的应用程序中,我历来有一个primary key
on id string NOT NULL
,但现在我想在这个表上添加分区,在生成的日期列上,就像在示例中一样partition_date timestamp GENERATED ALWAYS AS date_trunc('day', created_at)
。我已经读过,对日期列进行分区将有助于提高按时间段范围内的查询速度(例如,计算今天的所有记录,只会命中今天的分区),并帮助我归档较旧的数据帧(例如 > 180 天的任何数据) ),但我不想失去单 PK 查找的性能。
所以,既然我做不到PARTITIONED BY (partition_date)
,我最好……
a) 删除主键约束id
?我很紧张这会影响我的单行查找性能!在这种情况下,PK 必须在分区键中是有意义的,因为理想情况下查找WHERE id = "abc-123"
应该只需要命中单个节点。
或者
b) 使用两列作为分区键,比如PARTITIONED BY (id, partition_date)
-- 这看起来很奇怪,因为本能地,我想假设它id
具有高基数并且对于分区列来说是一个糟糕的选择,而“日”或“月”会更好,如您的文档中的示例所示。在这种情况下,我的 PK 查找是否命中了每个分区,或者它是否确切地知道要去哪里?如果我运行仅限于今天的聚合查询,它会命中每个分区还是只命中保存今天数据的分区?