Postgres 创建分区表的三种方式

  • 1 range 范围分区

  • 此处以时间范围分区,数值范围同理
  • 建表语句
  • create table demorange(
        int serial8,
        val int,
        crt timestamp
    ) partition by range (crt);
    
  • 创建过去30天的分区
  • do language plpgsql
    $$
        begin
            for i in 0..30 loop
                execute format($date$ create table demorange_%s partition of demorange for values from ( %L ) to ( %L ) $date$,
                    to_char(current_date-i-1, 'mmdd'), current_date - i - 1, current_date - i );
                end loop;
        end;
        $$;
    
  • 查看分区
  • select  a.relname part,c.relname parent
    from pg_class a
    join pg_inherits b on a.oid = b.inhrelid
    join pg_class c on c.oid = b.inhparent
    where c.relname = 'demorange';
    
partparent
demorange_0829demorange
demorange_0828demorange
demorange_0827demorange
demorange_0826demorange
demorange_0825demorange
demorange_0824demorange
demorange_0823demorange
demorange_0822demorange
demorange_0821demorange
  • 插入数据
  • insert into demorange(val, crt) select random(), current_date - (random()*30 + 1 )::int 
    from generate_series(1,100000);
    -- 或者
    insert into demorange(val, crt) select random(), current_date + ((-(random()*30+1)*24)::int || 'hour')::interval 
    from generate_series(1,100000);
    
  • 接下来就可以查询分区表了
  • select * from demorange where crt < current_date-3 and crt > current_date-4;
    select * from demorange_0821;
    

  • 2 list分区

  • 建表语句
  • create table demolist(
        int serial8,
        type_code varchar,
        val int
    ) partition by list (type_code);
    
  • 建立分区
  • do language plpgsql
    $$
        begin
            for i in 0..30 loop
                execute format($list$ create table demolist_%s partition of demolist for values in (%s) $list$,
                    i, i);
                end loop;
        end;
        $$;
    
  • 插入数据
  • insert into demolist(type_code, val)  select (random()*30)::int, random() 
    from generate_series(1, 100000);
    

  • hash分区

  • 建表语句
  • create table demohash(
        int serial8,
        val int,
        crt timestamp
    ) partition by hash (val);
    
  • 建立分区
  • 以31为模举例
  • do language plpgsql
    $$
        begin
            for i in 0..30 loop
                execute format($list$ create table demohash_%s partition of demohash for values with (modulus 31, remainder %s) $list$,
                    i, i);
                end loop;
        end;
        $$;
    
  • 插入数据
  • insert into demohash(val, crt)  select (random()*10000)::int, current_date - ((random()*1000)::int||'hour')::interval
    from generate_series(1, 100000);
    
    -- 查询分区表
    select * from demohash;
    select * from demohash_1;
    
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PostgreSQL中的哈希分区表是一种在表数据被分布在多个分区中的表。它使用哈希函数将表数据分散到多个分区中,从而使查询效率更高。 以下是创建哈希分区表的示例: ``` CREATE TABLE my_partitioned_table ( id INTEGER NOT NULL, data TEXT ) PARTITION BY HASH(id); CREATE TABLE my_partition_1 PARTITION OF my_partitioned_table FOR VALUES WITH (MODULUS 4, REMAINDER 0); CREATE TABLE my_partition_2 PARTITION OF my_partitioned_table FOR VALUES WITH (MODULUS 4, REMAINDER 1); CREATE TABLE my_partition_3 PARTITION OF my_partitioned_table FOR VALUES WITH (MODULUS 4, REMAINDER 2); CREATE TABLE my_partition_4 PARTITION OF my_partitioned_table FOR VALUES WITH (MODULUS 4, REMAINDER 3); ``` 上面的示例中,我们创建了一个名为 `my_partitioned_table` 的哈希分区表,并将其按照 `id` 字段进行哈希分区。接着,我们创建了四个分区表,每个分区表对应于哈希函数的不同结果。 当我们向 `my_partitioned_table` 中插入数据时,PostgreSQL会根据哈希函数的结果将数据插入到相应的分区表中。当我们进行查询时,PostgreSQL会自动将查询分发到相应的分区表中,从而提高查询效率。 需要注意的是,哈希分区表在某些情况下可能会导致数据不平衡。例如,如果哈希函数的结果分布不均匀,则某些分区表可能会比其他分区表更大。因此,在使用哈希分区表时,需要仔细考虑哈希函数的选择和分区策略的设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值