PostgreSQL分区表相关

本文探讨了PostgreSQL中分区表的实现方式及其优缺点,包括使用触发器和规则的不同场景适用性,并介绍了如何通过开启排除约束来优化查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分区表是采用表继承的方式来实现的,主表中不存放任何的数据。
分区表中插入数据可以依赖触发器、也可以使用PG中的rule(规则)

但使用规则有如下的缺点:
(1)相比于触发器,该规则有显著的开销,而且每次检查是都会有此开销。不过,批量插入时只会有一次开销,所以在批量插入的情况下,去其相对于触发器更有优势。然后在更多的情况下,触发器的方法更好一些。
(2)如果想用COPY插入数据,由于COPY不会触发“规则”,因此先得把要复制的数据直接COPY到分区表(不是主表)。不过,COPY是会触发触发器的,所以用触发器的方法就可以正常使用。
(3)如果插入数据是在规则设置之外的,那么会插入到主表中。如果此时希望直接报错,而不是把数据插入到主表中,使用规则是无法实现的。


打开排除约束(constraint_exclusion)是一种查询优化技巧。在PG9.2.4中,参数constraint_exclusion默认就是partition,如果采用默认值,在SQL查询中将WHERE语句的过滤条件与表上的CHECK条件进行对比,就可得知不需要扫描的分区,从而跳过相应的分区表,性能也就得到了提高。
### 创建和管理PostgreSQL中的分区表 #### 创建分区表的方法 在PostgreSQL中,创建分区表的过程涉及定义父表以及子表。对于不同的需求可以选择不同类型的分区策略,主要包括范围分区、列表分区和哈希分区[^3]。 - **范围分区**适用于基于数值或日期字段的数据集划分。 ```sql CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate); ``` - **列表分区**适合于依据离散值集合来分配数据的情况。 ```sql CREATE TABLE cities ( city_name text primary key, state char(2) ) PARTITION BY LIST (state); ``` - **哈希分区**则用于按照特定列的哈希值均匀分布记录到各个分区内。 ```sql CREATE TABLE t_h AS SELECT * FROM generate_series(1,10000) i; ALTER TABLE t_h SET (autovacuum_enabled = 'false'); CREATE TABLE h_i_1 PARTITION OF t_h FOR VALUES WITH (MODULUS 4, REMAINDER 0); ``` 上述命令展示了不同类型分区表的基础结构建立方式[^4]。 #### 管理分区表的方式 为了有效管理和维护这些分区对象,在日常操作过程中需要注意以下几个方面: - 添加新的分区 当业务增长导致现有分区不足以容纳新产生的数据时,则需增加额外的分区以扩展存储空间。 ```sql ALTER TABLE measurement ADD PARTITION measurement_y2018m07 START ('2018-07-01') END ('2018-08-01'); ``` - 删除不再使用的旧分区 对于过期或者无用的历史数据所对应的分区可以安全移除,从而释放资源。 ```sql DROP TABLE IF EXISTS measurement_y2016m09 CASCADE; ``` - 修改已有分区属性 如果发现某些配置参数设置不合理影响到了整体性能表现的话,可以通过调整相应选项来进行优化改进。 ```sql ALTER TABLE ONLY measurement ATTACH PARTITION measurement_y2018m07 FOR VALUES FROM ('2018-07-01') TO ('2018-08-01'); ``` 以上就是针对PostgreSQL内部分区表的一些基本介绍及其具体实践指南[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值