postgresql hash分区,partition by hash

What & Why

  • What

什么是分表: 把一个大表分成若干分区,使其物理上分散,逻辑上连续。各分区继承一个母表,对母表进行的操作会自动同步到各分区(包括插入数据时按照分表方式自动导入不同分区、建立索引等)。

  • Why

单表数据量过大(对于博主8GRAM的商务本来说,千万级),影响查询性能。
分表的优点:

显著提升查询性能,尤其是当频繁访问的记录在同一个分区或少数几个分区中时。
分区索引在一定程度上替代了传统的索引,可以减小索引占用的空间。
批量读取和删除可以以分区为单位完成,例如detach partition这种操作速度远远快于bulk delete操作。

PostgreSQL分表方式

  1. Range Partitioning
    将某列(或某几列)的值划分成互不重叠的区间,如时间按月划分。
  2. List Partitioning
    按枚举出的一些值分区。
  3. Hash Partitioning
    指定一个模数(modulus),将hash值对模取余(remainder),余数相同的分到同一分区。
    range、list方式可能会出现数据不均匀的情况,如冰棍销售情况按月分表,夏天销量远高于冬天。

创建分区表

create table dept (id  int primary key) partition by hash(id) ; 

创建10个分区
创建分区(以10为模数,按余数分10个区)

create table dept_1 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 0);
create table dept_2 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 1);
create table dept_3 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 2);
create table dept_4 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 3);
create table dept_5 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 4);
create table dept_6 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 5);
create table dept_7 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 6);
create table dept_8 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 7);
create table dept_9 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 8);
create table dept_10 partition of dept FOR VALUES WITH (MODULUS 10, REMAINDER 9);

插入测试数据

insert into dept (select generate_series(0,200000));

创建索引
对母表进行操作即可,已存在的分区和后续创建的分区上也会包含该索引。

CREATE INDEX ON dept (id);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL supports table partitioning using the `PARTITION BY` clause. Partitioning is a technique to divide a large table into smaller pieces called partitions. Each partition is stored separately and can be accessed and managed independently. The `PARTITION BY` clause is used to specify the partition key column or columns. The partition key is used to determine which partition a row belongs to. Here is an example of partitioning a table by a date column: ``` CREATE TABLE sales ( id SERIAL PRIMARY KEY, sale_date DATE NOT NULL, amount NUMERIC(10,2) NOT NULL ) PARTITION BY RANGE (sale_date); ``` This creates a table called `sales` with a partition key of `sale_date`. The `PARTITION BY RANGE` clause specifies that the table is partitioned by ranges of values of the `sale_date` column. To create partitions for the `sales` table, you can use the `CREATE TABLE` command with the `PARTITION OF` clause: ``` CREATE TABLE sales_q1 PARTITION OF sales FOR VALUES FROM ('2022-01-01') TO ('2022-04-01'); CREATE TABLE sales_q2 PARTITION OF sales FOR VALUES FROM ('2022-04-01') TO ('2022-07-01'); CREATE TABLE sales_q3 PARTITION OF sales FOR VALUES FROM ('2022-07-01') TO ('2022-10-01'); CREATE TABLE sales_q4 PARTITION OF sales FOR VALUES FROM ('2022-10-01') TO ('2023-01-01'); ``` This creates four partitions for the `sales` table, one for each quarter of the year. Each partition is defined using the `FOR VALUES FROM` clause with a range of dates. When you insert data into the `sales` table, PostgreSQL will automatically route the data to the correct partition based on the partition key value. This can result in faster queries and better performance for large tables.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值