当前位置: 首页 > news >正文

postgresql分区表

分区表的作用是提升查询效率,对于插入也有一定的优化,就是一张表,划分成多个物理表。

分区表主要以范围、列表、哈希这三种,目前最多的就是范围,典型的就刷时间,所有这里也以时间范围为例。

创建分区表

分区创建有2种方式,分别是继承和声明。pg10以前只是继承,pg10以后支持声明。需要说明的刷pg数据库还支持多久符合分区。

1.声明

CREATE TABLE sales (id SERIAL,sale_date DATE NOT NULL,amount DECIMAL(10,2)
) PARTITION BY RANGE (sale_date);-- 创建季度分区
CREATE TABLE sales_q1 PARTITION OF salesFOR VALUES FROM ('2025-01-01') TO ('2025-04-01');
CREATE TABLE sales_q2 PARTITION OF salesFOR VALUES FROM ('2025-04-01') TO ('2025-07-01');

2.继承

1.创建父表
CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
);

2.创建继承表,指定约束范围
CREATE TABLE measurement_202409 (
    CHECK ( logdate >= DATE '2024-09-01' AND logdate < DATE '2024-10-01' )
) INHERITS (measurement);
CREATE TABLE measurement_202410 (
    CHECK ( logdate >= DATE '2024-10-01' AND logdate < DATE '2024-11-01' )
) INHERITS (measurement);

继承的方式比较灵活,当然也就比较麻烦,还可以重定向,目前很少这样,有需求还可以了解。

这里不讲。

维护分区

创建分区SQL

CREATE TABLE sales_q1 PARTITION OF
 sales
    FOR VALUES FROM ('2025-01-01') TO ('2025-04-01'
);

管理创建分区

先说创建分区,可以使用创建分区的sql语句操作分区,也可以使用触发器或者存储过程管理,pg也可以使用插件。

目前的资料显示推荐触发器,只是我的理解触发器每次插入数据都会检查,实际操作是提前将分区表一次创建很久,1年或者5年。但是推荐使用触发器我没有明白 不会降低效率吗?

触发器创建

这里还是说说触发器。样例:

CREATE OR REPLACE FUNCTION create_monthly_partitions()
RETURNS VOID AS $$
BEGINFOR i IN 0..11 LOOPEXECUTE format('CREATE TABLE sales_%s PARTITION OF sales FOR VALUES FROM (%L) TO (%L)',to_char(CURRENT_DATE + (i || ' month')::interval, 'YYYY_MM'),CURRENT_DATE + (i || ' month')::interval,CURRENT_DATE + ((i+1) || ' month')::interval);END LOOP;
END;
$$ LANGUAGE plpgsql;

这样就会按照月份创建一个触发器来自动创建。

pg_partman 扩展插件

下载插件编译安装,稳定刷linux环境下的编译安装。

安装完成后需要做以下工作:

1.postgresql.conf 文件中添加以下配置

shared_preload_libraries = 'pg_partman_bgw'

2.数据库中执行命令

CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;

插件地址:

pgpartman/pg_partman: Partition management extension for PostgreSQL

删除分区

直接删除分区和数据

DROP TABLE 分区表名;

分离删除

-- 假设你有一个名为 partitioned_table 的父表
-- 首先,从父表中分离分区
DETACH PARTITION partitioned_table FOR VALUES IN (1);

-- 然后,删除这个分区
DROP TABLE partitioned_table_part1;
 

删除分区

ALTER TABLE partitioned_table DROP PARTITION FOR VALUES IN (1);
 

移除分区变成普通表

 alter table t_range detach partition t_range_2 ;

查询分区

1.查询所有

-- 查询所有分区表
SELECT nmsp_parent.nspname AS parent_schema,parent.relname      AS parent_table,nmsp_child.nspname  AS child_schema,child.relname       AS child_table
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child  ON pg_inherits.inhrelid  = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child  ON nmsp_child.oid  = child.relnamespace;

2.查询特地分区

SELECT child.relname AS partition_name
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child  ON pg_inherits.inhrelid  = child.oid
WHERE parent.relname = 'sales'

3.查询声明式分区

-- 查询声明式分区表
SELECT n.nspname AS schema_name,c.relname AS table_name,c.relkind,CASE WHEN c.relispartition THEN 'YES' ELSE 'NO' END AS is_partition,CASE WHEN c.relispartition THEN pg_get_expr(c.relpartbound, c.oid) ELSE NULL END AS partition_bound,CASE WHEN c.relispartition THEN pg_get_partkeydef(c.oid) ELSE NULL END AS partition_key
FROM pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE c.relkind IN ('r', 'p')  -- 普通表或分区表
AND n.nspname NOT IN ('pg_catalog', 'information_schema');


4.整合查询需要的信息

SELECT parent.relname,
        child.relname,
                CASE WHEN child.relispartition THEN pg_get_expr(child.relpartbound, child.oid) ELSE NULL END AS
 partition_bound
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child  ON pg_inherits.inhrelid  = child.oid
 


 

http://www.dtcms.com/a/442713.html

相关文章:

  • 美食网站首页模板网络外包运营公司
  • Linux应用 文件属性和目录
  • pyQt实现一种按钮切换关联变化的勾选框的逻辑
  • 网站设计要先做图么网站建设为中心
  • Doris专题1- 什么是Doris
  • Linux文件系统---软硬连接
  • 如何建立商城网站拼团小程序制作平台
  • 火车头wordpress建站群网站移动站
  • 【51单片机32个灯,第一次亮1,2。第二次亮2,3。第三次亮3,4。。。。】2023-2-10
  • 【LangChain】P12 LangChain 提示词模板深度解析(三):实例化参数
  • 智能数据交换系统:内涵、架构、优化与发展趋势
  • 手机金融界网站网站单页是什么意思
  • 14.伪修复提交与来自“收容所”的坐标
  • 余姚做网站哪家好北京市工程信息网
  • 如何构建汽车电子与芯片半导体行业的一体化质量堡垒:全星质量管理QMS系统功能分析
  • 常微分方程万能解的形式
  • 专门做美剧的网站咸宁手机网站建设
  • sed使用手册
  • 网站开发搭建ssc p2p 互助做网站第一步做什么
  • 做教育网站有什么好处搜狗推广
  • 成品网站模板源码 网站源码模板 html源码下载
  • Scrapy 框架深度解析:架构、组件与工作流程
  • 网站例子谷歌搜索引擎免费
  • 深圳专业设计网站平台做网站为什么可以自学
  • Ruby CGI 编程
  • 【数形结合】当天先到者等未到者20分钟,见面概率
  • 广州广告制作有限公司优化工具 wordpress
  • 企业网站建设需要费用什么是4c品牌建设模型
  • 专门做简历的网站有哪些网站建设社区交流
  • 网站备案有什么要求吗html5开发手机网站