PostgreSQL父子表和分区表对比

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:
从整体上来看,子表和分区表有相同的地方也有差别,因为都使用了继承的特性,所以本质上是一样的。下面看一下二者的区别:

1.父子表:

--创建父表
CREATE TABLE cities (
name text,
population float,
altitude int
);
--创建子表
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
INSERT INTO cities values('Las Vegas', 1.53, 2174); --插入父表
INSERT INTO cities values('Mariposa',3.30,1953); --插入父表
INSERT INTO capitals values('Madison',4.34,845,'WI');--插入子表
--在父表上做查询,父表和子表的数据均被取出。
SELECT name, altitude FROM cities WHERE altitude > 500;
Las Vegas 2174
Mariposa 1953
Madison 845
--查看执行计划,实际上查询从扫描了两个表的数据,组合出想要的结果
explain analyze SELECT name,altitude FROM cities WHERE altitude > 500;
Append (cost=0.00..24.54 rows=361 width=36) (actual time=0.008..0.012 rows=3 loops=1)
-> Seq Scan on cities (cost=0.00..2.41 rows=38 width=36) (actual time=0.007..0.008 rows=2 loops=1)
Filter: (altitude > 500)
-> Seq Scan on capitals (cost=0.00..22.12 rows=323 width=36) (actual time=0.001..0.001 rows=1 loops=1)
Filter: (altitude > 500)
Planning time: 0.096 ms
Execution time: 0.044 ms
--在子表上做查询,只能查出子表上的数据。
SELECT name, altitude FROM capitals WHERE altitude > 500;
--如果只想从父表中取数据,则需要在SQL中加入ONLY关键字,如:
SELECT name,altitude FROM ONLY cities WHERE altitude > 500;
从这个例子看一看出,父子表使用了继承的特性,子表可以增加字断,另外子表可以继承于多个父表。但是仍然有个疑问,有什么卵用呢??



2.分区表:

分区表也是使用继承的特性,在逻辑上把一个大表分成几块数据,分区的字断和主表字断一致,不会再另行增加字断,另外可以人为定义约束,来约束每个表上的数据不重复。

--创建主表示例:
CREATE TABLE measurement (
city_id int NOT NULL,
logdate date NOT NULL,
peaktemp int
);
--创建几个子表,继承父表所有字断:
CREATE TABLE measurement_yy04mm02 (
CHECK ( logdate >= DATE '2004-02-01' AND logdate < DATE '2004-03-01')
) INHERITS (measurement);
CREATE TABLE measurement_yy04mm03 (
CHECK (logdate >= DATE '2004-03-01' AND logdate < DATE '2004-04-01')
) INHERITS (measurement);
...
CREATE TABLE measurement_yy05mm11 (
CHECK (logdate >= DATE '2005-11-01' AND logdate < DATE '2005-12-01')
) INHERITS (measurement);
CREATE TABLE measurement_yy05mm12 (
CHECK (logdate >= DATE '2005-12-01' AND logdate < DATE '2006-01-01')
) INHERITS (measurement);
CREATE TABLE measurement_yy06mm01 (
CHECK (logdate >= DATE '2006-01-01' AND logdate < DATE '2006-02-01')
) INHERITS (measurement);
从这个例子看出,分区表完全继承主表字断,并且不另外增加字断,每个分区表上定义好约束,保证数据不要发生重叠。分区表在生产上还是很有用的,可以提高查询效率。
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 监控 关系型数据库
PostgreSQL普通表转换成分区表
如何使用pg_rewrite扩展将普遍表转换成分区表
|
6月前
|
关系型数据库 数据库 PostgreSQL
|
存储 SQL JSON
大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 特性解读
世界上几乎最强大的开源数据库系统 PostgreSQL,于 2019 年 10 月 3 日发布了 12 版本,该版本已经在阿里云正式发布。PostgreSQL 12 在功能和性能上都有很大提升,如大分区表高并发性能提升百倍,B-tree 索引空间和性能优化,实现 SQL 2016 标准的 JSON 特性,支持多列 MCV(Most-Common-Value)统计,内联 CTE(Common table expressions)以及可插拔的表存储访问接口等。本文对部分特性进行解读。
2902 0
大分区表高并发性能提升100倍?阿里云 RDS PostgreSQL 12 特性解读
|
SQL 弹性计算 算法
PostgreSQL 普通表在线转换为分区表 - online exchange to partition table
标签 PostgreSQL , 分区表 , 在线转换 背景 非分区表,如何在线(不影响业务)转换为分区表? 方法1,pg_pathman分区插件 《PostgreSQL 9.5+ 高效分区表实现 - pg_pathman》 使用非堵塞式的迁移接口 partition_table_concurrently( relation REGCLASS,
2731 0
|
存储 SQL 监控
16PostgreSQL 本地分区表的用法和优化|学习笔记
快速学习16PostgreSQL 本地分区表的用法和优化
886 0
16PostgreSQL 本地分区表的用法和优化|学习笔记
|
存储 NoSQL 关系型数据库
阿里云rds并发性能解读-大分区表高并发性能提升100倍?
Redis读写分离实例的原理是:key统一写入到master,然后通过主从复制同步到slave,用户的请求通过proxy做判断,如果是写请求,转发到master;如果是读请求,分散转发到slave,这种架构适合读请求数量远大于写请求数量的业务
2603 0
阿里云rds并发性能解读-大分区表高并发性能提升100倍?
|
SQL 算法 关系型数据库
PostgreSQL 普通表在线转换为分区表 - online exchange to partition table
PostgreSQL 普通表在线转换为分区表 - online exchange to partition table
2788 0
|
SQL 弹性计算 Oracle
PostgreSQL native partition 分区表性能优化之 - 动态SQL+服务端绑定变量
标签 PostgreSQL , 分区表 , native partition , 性能 , pg_pathman , plpgsql , 动态SQL , 服务端绑定变量 , prepare , execute 背景 目前PG的native partition分区性能不佳,一种解决方法是使用pg_pathman插件,另一种方法是业务上直接插分区,还有一种方法是使用UDF函数接口(函数内部使
1436 0
|
弹性计算 关系型数据库 测试技术
PostgreSQL 分区表如何支持多列唯一约束 - 枚举、hash哈希 分区, 多列唯一, insert into on conflict, update, upsert, merge insert
标签 PostgreSQL , 分区表 , native partition , 唯一 , 非分区键唯一 , 组合唯一 , insert into on conflict , upsert , merge insert 背景 PG 11开始支持HASH分区,10的分区如果要支持hash分区,可以通过枚举绕道实现。 《PostgreSQL 9.x, 10, 11 hash分区表 用法举例
3116 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL使用表继承实现分区表
PostgreSQL9.6支持基本表的分区。这部分将描述为什么以及如何来实现表分区作为你数据库设计的一部分。 概述 分区指的是将逻辑上一的一个大表分成多个小的物理上的片(子表),分区可以提供以下好处: .在某些情况下查询性能能够显著提升,特别是当那些访问压力大的行在一个分区或者少数几个分区时。
1283 0