千家信息网

PostgreSQL11有哪些新特性

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"PostgreSQL11有哪些新特性",在日常操作中,相信很多人在PostgreSQL11有哪些新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"P
千家信息网最后更新 2026年11月01日PostgreSQL11有哪些新特性

这篇文章主要介绍"PostgreSQL11有哪些新特性",在日常操作中,相信很多人在PostgreSQL11有哪些新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"PostgreSQL11有哪些新特性"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、并行查询

Parallel Hash
Hash Join执行时,在构造Hash表和进行Hash连接时,PG 11可使用并行的方式执行。
测试脚本:

testdb=# create table t1 (c1 int,c2 varchar(40),c3 varchar(40));CREATE TABLEtestdb=# testdb=# insert into t1 select generate_series(1,5000000),'TEST'||generate_series(1,1000000),generate_series(1,1000000)||'TEST';INSERT 0 5000000testdb=# drop table if exists t2;DROP TABLEtestdb=# create table t2 (c1 int,c2 varchar(40),c3 varchar(40));CREATE TABLEtestdb=# testdb=# insert into t2 select generate_series(1,1000000),'T2'||generate_series(1,1000000),generate_series(1,1000000)||'T2';INSERT 0 1000000testdb=# explain verbosetestdb-# select t1.c1,t2.c1 testdb-# from t1 inner join t2 on t1.c1 = t2.c1;                                         QUERY PLAN                                          --------------------------------------------------------------------------------------------- Gather  (cost=18372.00..107975.86 rows=101100 width=8)   Output: t1.c1, t2.c1   Workers Planned: 2 -- 2 Workers   ->  Parallel Hash Join  (cost=17372.00..96865.86 rows=42125 width=8) -- Parallel Hash Join         Output: t1.c1, t2.c1         Hash Cond: (t1.c1 = t2.c1)         ->  Parallel Seq Scan on public.t1  (cost=0.00..45787.33 rows=2083333 width=4)               Output: t1.c1         ->  Parallel Hash  (cost=10535.67..10535.67 rows=416667 width=4) -- Parallel Hash               Output: t2.c1               ->  Parallel Seq Scan on public.t2  (cost=0.00..10535.67 rows=416667 width=4)                     Output: t2.c1

除了Parallel Hash外,PG 11在执行Parallel Append(执行UNION ALL等集合操作)/CREATE TABLE AS SELECT/CREATE MATERIALIZED VIEW/SELECT INTO/CREATE INDEX等操作时以并行的方式执行.

二、数据表分区

Hash Partition
PG 在11.x引入了Hash分区,关于Hash分区,官方文档有如下说明:

The table is partitioned by specifying a modulus and a remainder for each partition. Each partition will hold the rows for which the hash value of the partition key divided by the specified modulus will produce the specified remainder.

每个Hash分区需指定"模"(modulus)和"余"(remainder),数据在哪个分区(partition index)的计算公式:
partition index = abs(hashfunc(key)) % modulus

drop table if exists t_hash2;create table t_hash2 (c1 int,c2  varchar(40),c3 varchar(40)) partition by hash(c1);create table t_hash2_1 partition of t_hash2 for values with (modulus 6,remainder 0);create table t_hash2_2 partition of t_hash2 for values with (modulus 6,remainder 1);create table t_hash2_3 partition of t_hash2 for values with (modulus 6,remainder 2);create table t_hash2_4 partition of t_hash2 for values with (modulus 6,remainder 3);create table t_hash2_5 partition of t_hash2 for values with (modulus 6,remainder 4);create table t_hash2_6 partition of t_hash2 for values with (modulus 6,remainder 5);testdb=# insert into t_hash2 testdb-# select generate_series(1,1000000),'HASH'||generate_series(1,1000000),generate_series(1,1000000)||'HASH';INSERT 0 1000000

数据在各分区上的分布大体均匀.
2018-9-19 注:由于插入数据时语句出错,昨天得出的结果有误(但数据在各个分区的分布上不太均匀,t_hash2_1分区行数明显的比其他分区的要多很多),请忽略

testdb=# select count(*) from only t_hash2;; count -------     0(1 row)testdb=# select count(*) from only t_hash2_1; count  -------- 166480(1 row)testdb=# select count(*) from only t_hash2_2; count  -------- 166904(1 row)testdb=# select count(*) from only t_hash2_3; count  -------- 166302(1 row)testdb=# select count(*) from only t_hash2_4; count  -------- 166783(1 row)testdb=# select count(*) from only t_hash2_5; count  -------- 166593(1 row)testdb=# select count(*) from only t_hash2_6; count  -------- 166938(1 row)

Hash分区键亦可以创建在字符型字段上

testdb=# drop table if exists t_hash4;DROP TABLEtestdb=# create table t_hash4 (c1 int,c2  varchar(40),c3 varchar(40)) partition by hash(c2);CREATE TABLE-- 需创建相应的"Partition"用于存储相应的数据testdb=# insert into t_hash4 testdb-# select generate_series(1,100000),'HASH'||generate_series(1,1000000),generate_series(1,1000000)||'HASH';ERROR:  no partition of relation "t_hash4" found for rowDETAIL:  Partition key of the failing row contains (c2) = (HASH1).-- 6个分区,3个sub-table,插入数据会出错testdb=# testdb=# create table t_hash4_1 partition of t_hash4 for values with (modulus 6,remainder 0);CREATE TABLEtestdb=# create table t_hash4_2 partition of t_hash4 for values with (modulus 6,remainder 1);CREATE TABLEtestdb=# create table t_hash4_3 partition of t_hash4 for values with (modulus 6,remainder 2);CREATE TABLEtestdb=# insert into t_hash4 testdb-# select generate_series(1,10000),'HASH'||generate_series(1,10000),generate_series(1,10000)||'HASH';ERROR:  no partition of relation "t_hash4" found for rowDETAIL:  Partition key of the failing row contains (c2) = (HASH1).-- 3个分区,3个sub-table,正常testdb=# drop table if exists t_hash4;DROP TABLEtestdb=# create table t_hash4 (c1 int,c2  varchar(40),c3 varchar(40)) partition by hash(c2);CREATE TABLEtestdb=# create table t_hash4_1 partition of t_hash4 for values with (modulus 3,remainder 0);CREATE TABLEtestdb=# create table t_hash4_2 partition of t_hash4 for values with (modulus 3,remainder 1);CREATE TABLEtestdb=# create table t_hash4_3 partition of t_hash4 for values with (modulus 3,remainder 2);CREATE TABLEtestdb=# insert into t_hash4 testdb-# select generate_series(1,10000),'HASH'||generate_series(1,10000),generate_series(1,10000)||'HASH';INSERT 0 10000

考察分区的数据分布,还比较均匀:

testdb=# testdb=# select count(*) from only t_hash4; count -------     0(1 row)testdb=# select count(*) from only t_hash4_1; count -------  3378(1 row)testdb=# select count(*) from only t_hash4_2; count -------  3288(1 row)testdb=# select count(*) from only t_hash4_3; count -------  3334(1 row)

Default Partition
List和Range分区可指定Default Partition(Hash分区不支持).

Update partition key
PG 11可Update分区键,这会导致数据的"迁移".

Create unique constraint
PG 11在分区表上创建主键和唯一索引(注:Oracle在很早的版本已支持此特性).
在普通字段上可以创建BTree索引.

testdb=# alter table t_hash2 add primary key(c1);ALTER TABLEtestdb=# create index idx_t_hash2_c2 on t_hash2(c2);CREATE INDEX

FOREIGN KEY support
PG 11支持在分区上创建外键.

除了上述几个新特性外,分区上面,PG 11在Automatic index creation/INSERT ON CONFLICT/Partition-Wise Join / Partition-Wise Aggregate/FOR EACH ROW trigger/Dynamic Partition Elimination/Control Partition Pruning上均有所增强.

到此,关于"PostgreSQL11有哪些新特性"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

数据 特性 学习 支持 字段 方式 更多 索引 帮助 字符型 实用 明显 普通 接下来 公式 字符 官方 数据表 文档 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网政务服务 美国互联网科技巨头监管 合肥互联网科技公司 深圳齐家互联网科技 互联网科技大会 深圳市运趣互联网科技有限公司 青岛中康互联网医疗科技有限公司 广州恒生互联网科技有限 互联网金融中的现代科技 链环科技传统企业怎么转型互联网 企晟互联网信息科技有限公司 朱啸虎曾投资哪些互联网科技企业 互联网公司高科技产品 银行科技岗属于互联网吗 启辰互联网科技 工业互联网科技创业 济南小医互联网科技有限公司招聘 西安左小互联网科技有限公司 互联网科技职业技能培训学校 北京军民互联网科技公司 互联网科技海报 涨乐互联网科技 互联网科技logo设计 互联网汽车科技小镇 中国科技互联网公司收入 深圳无忧互联网科技 西安有哪些互联网高科技企业 互联网时代科技型公司的机会 张家口科技产业互联网平台 山东蛋芒互联网科技有限公司
0