postgresql实现对已有数据表分区处理的操作详解

 更新时间:2023年12月21日 08:28:10   作者:用户3919820697669  
这篇文章主要为大家详细介绍了postgresql实现对已有数据表分区处理的操作的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

背景:业务初期创建的一张表,有 20 个字段,没有超长超大字段。随着系统运行,数据量来到了将近 1.3 亿行约 60GB。目前整体稳定,考虑到后续数据持续增长,打算先对表进行分区处理。考虑分区的主要因素是,这张表的数据主要是插入,和对最近插入数据的查询,后续会有少量针对该表的全量查询操作。

一、对已有数据进行备份

创建备份表并将所有的数据备份到 t_test_back 表里。这种方式备份,只会复制表结构和表数据,不会包含索引和约束。并且这种方式不会涉及到加锁等操作,整体执行很快,60GB 的数据大概在 5 分钟左右备份完成。

create table public.t_test_back as (select * from public.t_test);

二、删除原表

删除原表之前,记得先保留好建表语句,原表索引和约束,原建表语句如下:

CREATE TABLE public.t_test (
    id bigserial NOT NULL,
    column1 int8 NOT NULL,
    column2 varchar NOT NULL,
    column3 varchar NULL,
    create_time timestamptz NULL,
    CONSTRAINT t_test_pkey PRIMARY KEY (id)
);

CREATE INDEX column1_idx ON public.t_test USING btree (column1);
CREATE INDEX column2_idx ON public.t_test USING btree (column2);

删除原表直接使用 drop 语句:

drop table public.t_test;

我执行的时候,大概十分钟没有反应,最后查询检查 pg_stat_activity 视图,发现 public.t_test 还有 active sql 执行。

通过下面的方式,将在执行中的 sql 全部中断掉。

-- 找到当前表还在执行的查询
select pid, query, state from pg_stat_activity where state = 'state' and query like '%t_test%';
-- 可以取消查询
select pg_cancel_backend(pid);
-- 也可以强制中止会话
select pg_terminate_backend(pid);

将执行中的查询取消后,drop 操作很快完成,正常执行预估也是在 5 分钟左右能执行完成。

三、创建分区表

根据原表建表语句创建分区表,其中分区字段需要作为pk的一部分,我使用时间字段 create_timerange 分区:

CREATE TABLE public.t_test (
    id bigserial NOT NULL,
    column1 int8 NOT NULL,
    column2 varchar NOT NULL,
    column3 varchar NULL,
    create_time timestamptz NOT null DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT t_test_pkey PRIMARY KEY (id, create_time)
) partition by range(create_time);

我这里一年的数据量大概是 8 千万,我按照半年一个分区建表,最后有一个 DEFAULT 的分区表,用来存储分区以外的数据:

create table public.t_test_2022_02 partition of public.t_test for values from ('2022-06-01 00:00:00') to ('2022-12-31 23:59:59');

create table public.t_test_2023_01 partition of public.t_test for values from ('2023-01-01 00:00:00') to ('2023-06-30 23:59:59');
create table public.t_test_2023_02 partition of public.t_test for values from ('2023-07-01 00:00:00') to ('2023-12-31 23:59:59');

create table public.t_test_2024_01 partition of public.t_test for values from ('2024-01-01 00:00:00') to ('2024-06-30 23:59:59');
create table public.t_test_2024_02 partition of public.t_test for values from ('2024-07-01 00:00:00') to ('2024-12-31 23:59:59');

create table public.t_test_default partition of public.t_test DEFAULT;

我这里将原来的索引直接用在分区表的主表上:

CREATE INDEX column1_idx ON public.t_test USING btree (column1);
CREATE INDEX column2_idx ON public.t_test USING btree (column2);

由于我使用的 postgresqlserial 类型做 id 字段的自增序列,所以还需要将序列的最新值更新到比之前表的最大 id 还要大。防止主键冲突。

alter sequence public.t_test_id_seq restart 340000000;

四、数据恢复

由于我的表的数据主要使用的是增量数据,所以我把 id 最大的一条数据插入数据库表后,就可以恢复服务。 最后用 sql 将剩余的数据插入新表即可:

insert into public.t_test (select * from public.t_test_back);

到此这篇关于postgresql实现对已有数据表分区处理的操作详解的文章就介绍到这了,更多相关postgresql数据表分区处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于PostgreSQL JSONB的匹配和交集问题

    关于PostgreSQL JSONB的匹配和交集问题

    这篇文章主要介绍了PostgreSQL JSONB的匹配和交集问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • PostgreSQL数据库备份的几种实现方法

    PostgreSQL数据库备份的几种实现方法

    本文主要介绍了PostgreSQL数据库备份的几种实现方法,包括pg_dump和pg_dumpall是PostgreSQL备份工具,前者备份单数据库,后者备份整个集群,感兴趣的可以了解一下
    2025-06-06
  • PostgreSQL如何选择合适的数据类型

    PostgreSQL如何选择合适的数据类型

    本文详细介绍了PostgreSQL中各种数据类型的特性、适用场景、潜在陷阱及最佳实践,涵盖了数值、字符、时间、布尔、枚举、网络、JSON、几何、全文搜索、范围、自定义类型等核心类别,并通过真实案例说明了数据类型选型的逻辑,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • postgreSQL 中的自定义操作符示例详解

    postgreSQL 中的自定义操作符示例详解

    文章介绍了PostgreSQL在操作符定义方面的创新和灵活性,包括如何使用OPERATOR()语法显式调用操作符,以及如何自定义操作符以满足特定需求,文章还讨论了PostgreSQL在自定义操作符方面的优势,如操作符重载、索引绑定和对优化器的影响,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • pgsql之create user与create role的区别介绍

    pgsql之create user与create role的区别介绍

    这篇文章主要介绍了pgsql之create user与create role的区别介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 在Ubuntu中安装Postgresql数据库的步骤详解

    在Ubuntu中安装Postgresql数据库的步骤详解

    PostgreSQL 是一款强大的,开源的,对象关系型数据库系统。它支持所有的主流操作系统,包括 Linux、Unix(AIX、BSD、HP-UX,SGI IRIX、Mac OS、Solaris、Tru64) 以及 Windows 操作系统。本文给大家介绍了在Ubuntu中安装Postgresql数据库的步骤,需要的朋友可以参考下。
    2017-09-09
  • PostgreSQL实现透视表查询的方法详解

    PostgreSQL实现透视表查询的方法详解

    PostgreSQL 8.3版本发布时,引入了一个名为tablefunc的新扩展,这个扩展提供了一组非常有趣的函数,其中之一是交叉表函数,用于创建数据透视表,这就是我们将在本文中讨论的内容,本文给大家介绍了PostgreSQL实现透视表查询的方法,需要的朋友可以参考下
    2024-12-12
  • 在postgreSQL中运行sql脚本和pg_restore命令方式

    在postgreSQL中运行sql脚本和pg_restore命令方式

    这篇文章主要介绍了在postgreSQL中运行sql脚本和pg_restore命令方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • mac装PostgreSQL安装失败的问题及解决

    mac装PostgreSQL安装失败的问题及解决

    这篇文章主要介绍了mac装PostgreSQL安装失败的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • postgresql关于like%xxx%的优化操作

    postgresql关于like%xxx%的优化操作

    这篇文章主要介绍了postgresql关于like%xxx%的优化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论