我有一个大表(超过 1B 记录),对表分区有特定要求:
(1)Postgres是否可以根据varchar字段的第一个字符对表进行分区?
例如:
对于以下 3 条记录:
a-blah
a-blah2
b-blah
a-blah
和 a-blah2
将进入“A”分区,b-blah
将进入“B”分区。
(2) 如果 Postgres 无法实现上述内容,那么什么是对不断增长的大型表进行均匀分区的好方法?(不按创建日期分区——因为这不是这些记录的内容有)。
最佳答案
您可以在 partition by
子句中使用表达式,例如:
create table my_table(name text)
partition by list (left(name, 1));
create table my_table_a
partition of my_table
for values in ('a');
create table my_table_b
partition of my_table
for values in ('b');
结果:
insert into my_table
values
('abba'), ('alfa'), ('beta');
select 'a' as partition, name from my_table_a
union all
select 'b' as partition, name from my_table_b;
partition | name
-----------+------
a | abba
a | alfa
b | beta
(3 rows)
如果分区不区分大小写,您可以使用
create table my_table(name text)
partition by list (lower(left(name, 1)));
阅读文档:
关于database - 基于varchar字段首字母的分区表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984591/