一.不同大版之前分区改进
版本 | 新增特性 |
---|---|
pg9 | 1.继承式分区 2.手动添加触发器或规则 |
pg10 | 1.声明式分区 2.分区索引手动创建,不能基于分区父表创建 |
pg11 | 1.新增哈希分区 2.基于的分区表创建索引 3.支持update分区 4.会创建一个默认default分区 5.分区支持创建主键,外键,索引,触发器 |
pg12 | 1.新增哈希分区 2.alter table attach partitions不会阻塞查询 |
pg13 | 1.支持before trigger(不允许改变插入数据的目标分区) 2.支持逻辑复制 |
二.pg10版本新特性
postgres=# select name,setting from pg_settings where name like '%parallel%';
name | setting
----------------------------------+---------
enable_parallel_append | on
enable_parallel_hash | on
force_parallel_mode | off
max_parallel_maintenance_workers | 2
max_parallel_workers | 8
max_parallel_workers_per_gather | 2
min_parallel_index_scan_size | 64
min_parallel_table_scan_size | 1024
parallel_leader_participation | on
parallel_setup_cost | 1000
parallel_tuple_cost | 0.1
(11 rows)
postgres=# select * from pg_settings where name='synchronous_standby_names';
-[ RECORD 1 ]---+--------------------------------------------------------------------------------
name | synchronous_standby_names
setting |
unit |
category | Replication / Master Server
short_desc | Number of synchronous standbys and list of names of potential synchronous ones.
extra_desc |
context | sighup
vartype | string
source | default
min_val |
max_val |
enumvals |
boot_val |
reset_val |
sourcefile |
sourceline |
pending_restart | f
-- 表级别的发布
postgres=# \h create publication
Command: CREATE PUBLICATION
Description: define a new publication
Syntax:
CREATE PUBLICATION name
[ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
| FOR ALL TABLES ]
[ WITH ( publication_parameter [= value] [, ... ] ) ]
-- 订阅
postgres=# \h create subscription
Command: CREATE SUBSCRIPTION
Description: define a new subscription
Syntax:
CREATE SUBSCRIPTION subscription_name
CONNECTION 'conninfo'
PUBLICATION publication_name [, ...]
[ WITH ( subscription_parameter [= value] [, ... ] ) ]
##函数改名
##目录名称改名
二、pg11版本新特性
JIT(Just in time):即时编译,程序在运行过程中即时进行编译,可以把编译的中间代码缓存或者优化。
postgresql代码中都是通用的逻辑实现的,从而导致在执行过程中可能造成大量不必要的跳转和代码分支执行,继而造成大量不必要的指令执行,造成CPU的压力。而使用JIT技术可以将代码扁平化(inline)执行,直接调用对应的函数,而且如果知道具体输入,还可以直接删除掉很多间接代码的执行。
pg11版本中国的实现了基于LLVM(Low Level Virtual Machine)的JIT
postgresql社区目前采用的外部依赖按需加载的方式,将JIT作为一种外挂在一定场景下提高性能,但是由于的没有有效手段评估JIT开启的代价
在pg11版本中JIT默认不开启的,PG12版本开启JIT是默认开启的
-- pg11版本下的JIT参数
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 11.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
(1 row)
-- 默认是不开启,需要在编译的时候使用--with-llvm参数开启
postgres=# select name,setting from pg_settings where name like '%jit%';
name | setting
-------------------------+---------
jit | off
jit_above_cost | 100000
jit_debugging_support | off
jit_dump_bitcode | off
jit_expressions | on
jit_inline_above_cost | 500000
jit_optimize_above_cost | 500000
jit_profiling_support | off
jit_provider | llvmjit
jit_tuple_deforming | on
(10 rows)
-- PG13版本下JIT参数
postgres=# select version();
version
---------------------------------------------------------------------------------------------------------
PostgreSQL 13.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
(1 row)
-- pg13默认开启JIT
postgres=# select name,setting from pg_settings where name like '%jit%';
name | setting
-------------------------+---------
jit | on
jit_above_cost | 100000
jit_debugging_support | off
jit_dump_bitcode | off
jit_expressions | on
jit_inline_above_cost | 500000
jit_optimize_above_cost | 500000
jit_profiling_support | off
jit_provider | llvmjit
jit_tuple_deforming | on
(10 rows)
postgres=# show max_parallel_maintenance_workers;
max_parallel_maintenance_workers
----------------------------------
2
(1 row)
pg11之前增加的一个包含非空默认值的字段,将会导致表数据的重新写入,为每一行添加该字段,并且填充默认值。对于大表则非常耗时
pg11开始增加非空字段则可以快速完成,只要通过在表pg_attribute中添加两个字段attfdwoptions和attmissingval。如果我非空行则attmissingval值为true,则说明不需要重写表。一旦表被重写,如执行vacuum full table操作,相应的attfdwoptions和attmissingval属性中值就会被清除,因为系统部在需要这些值。
##下放的四个系统函数
##新增默认角色
三、pg12新特性
pg12中将数据的物理地址ctid和索引存储在一起,成为索引的一部分。主键index scan速度更快,同时节省了index存储空间
PS: 如果reindex concurrently命令执行失败,则状态标识为不可用"invalid",之后只能通过reindex index命名重建,因此会阻塞表上的DML操作。
四、pg13新特性
1). 逻辑复制支持分区
2). 更多的一些情况下可以对分区进行裁剪和智能join
3). 分区表可以支持before trigger(不允许改变插入数据的目标分区)
4). 可以显示地发布分区表,自动发布所有分区
5). 从分区表中添加/删除分区将自动从发布中添加/删除
btree索引引入索引项去重技术,Deduplication。表中的列如果不是唯一的,可能会有很多相同的值,对应的B树索引也会有很多重复的索引记录。在pg13中索引借鉴了GIN索引的做法,将相同的key指向的对应行的ctid链接起来
在之前的版本中,每个表的vacuum操作并不能并行,当表比较大的时候,vacuum时间会很长,pg13支持对索引的并行vacuum,但存在较多限制
1)pg13新特性参考文档:https://blog.51cto.com/u_15064650/2884514
2)pg10~13特性比较参考文档:https://blog.51cto.com/lishiyan/2878479
3)JIT介绍参考文档:https://zhuanlan.zhihu.com/p/410352946