我有一张这样的桌子:
CREATE TABLE user (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
last_name VARCHAR(50),
created_at TIMESTAMP
)
我想按列分区created_at。一些消息来源说,最好按没有时间的日期进行分区,而不是timestamp按“y”。这应该会减少可能出现的问题的数量。这是否意味着我需要创建一个单独的列,例如created_at_date,并在其中写入一个没有时间的日期并将其移植?
但毕竟,为此您每次都需要指定一个额外的参数select,这会减慢请求速度+增加人为因素。不幸的是,没有足够的经验来完全理解这种解决方案的优缺点以及是否值得做。
PostgreSQL 不关心按日期或时间戳处理分区约束。或出于其他原因。虽然在计算表达式上。如果时区是指假设的可能问题,那么日期也取决于时区。
但是,我想从相反的问题开始:为什么要通过 created_at 对用户进行分区?您是否在此表中有数百 GB 的用户,并且只想保留最近几年注册的用户,而从该数据库中删除其余用户?你想用分区解决什么问题?
如果您确实有需要分区的理由,那么这里有一个包含两个分区的示例:
其他的以同样的方式添加。
我提请您注意,在 postgresql 11 中,主键可以在分区表本身中声明,但它还必须包含分区标志。例如,
primary key(id,created_at)。通常这不是必需的,可以添加primary key到部分本身,我在示例中进行了演示。但是,按 id 搜索将查看所有分区。使用分区表时,您必须始终指定分区参数。此外,完全符合表达式中描述特征的形式
PARTITION BY。否则,数据库将被迫扫描每个分区。解析几十个字节的附加条件的成本where- 当然,在这种背景下,将等于没有。