【问题标题】:Partitioning table based on first letter of a varchar field基于 varchar 字段的第一个字母的分区表
【发布时间】:2017-12-27 09:24:32
【问题描述】:

我有一个对表分区有特定要求的海量表(超过 1B 条记录):

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

例如:

对于以下 3 条记录:

a-blah
a-blah2
b-blah

a-blaha-blah2 将进入“A”分区,b-blah 将进入“B”分区。

(2) 如果 Postgres 无法实现上述操作,那么有什么好的方法可以均匀地对不断增长的大型表进行分区?(不按创建日期进行分区——因为这不是这些记录的内容有)。

【问题讨论】:

    标签: database postgresql


    【解决方案1】:

    您可以在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)));
    

    阅读文档:

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2015-12-14
      • 2022-12-14
      相关资源
      最近更新 更多