database - 基于varchar字段首字母的分区表

标签 database postgresql

我有一个大表(超过 1B 记录),对表分区有特定要求:

(1)Postgres是否可以根据varchar字段的第一个字符对表进行分区?

例如:

对于以下 3 条记录:

a-blah
a-blah2
b-blah

a-blaha-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/

相关文章:

MySQL 错误#1005

php - MySQL:今天是谁 "on"在两个不同的日期之间

php - 获取每行的总无数据

ruby-on-rails - Ruby 2.2:PG::CharacterNotInRepertoire:错误:编码 "UTF8"的无效字节序列

Django表单选择字段刷新

php - Laravel:使用 Eloquent 检索父类(super class)的实例

sql - 在 golang 中使用准备好的语句时,是否总是需要延迟 stmt.close()?

postgresql - 只有一个整数组合的 Postgres 索引

sql - 如何连接 3 个表并从 2 个表中计算正确的字段总和,而没有重复行?

python - psycopg2 + 存储过程 + 复合类型