postgresql不同大版本之间的特性比较

一.不同大版之前分区改进

  • pg9使用继承式分区,pg10实现了声明式分区,pg11完善了功能,pg12提升了性能
不同版本在分区表上的性能改进
版本 新增特性
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版本新特性

  • 增加声明式分区
  • pg_stat_activity视图新增信息列,以前版本只是包含用户后台服务进行进程信息
  • 增加了安全级别更高的密码验证的方式,SCRAM-SHA-256
  • hash索引可以走流复制,从此可以大胆使用hash索引
  • 增加并行功能,引入并行索引,完全支持并行b-tree扫描和bitmap
  • 引入Quorum Commit,支持同步复制多个standby
  • 提供了逻辑复制功能:发布订阅功能,create publication命令
  • 可以把多列组合在一起再创建直方图,让一些关联列的执行计划更准确,可创建跨列统计信息,create statistics
1.并行查询功能
  • pg9.6开始支持并行查询功能,但是比较弱,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)
2.Quorum Commit
  • pg10之前版本只能有的一台服务器充当同步节点,现在引入仲裁提交,支持同步多个复制standby
  • 通过仲裁配置参数synchronous_standby_names进行设置,支持FIRST和ANY两种模式指定同步复制节点
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
FIRST和ANY模式说明:
  • FIRST num_sync(standby_name [,…]):保持前面几个备库必须与主库保持同步
  • ANY num_sync(standby_name [,…]):保证的num_sync个备库与主库保持同步
  • 原配置:synchronous_standby_names='stb01,stb02,stb03’实际相当于synchronous_standby_names=FIRST 1(stb01,stb02,stb03)
3.逻辑复制功能
  • pg10原生提供了逻辑复制的功能,实现了逻辑发布和订阅的功能
  • pg10不支持truncate的同步,导致10版本中作为逻辑同步的表不能做truncate。从pg11之后可以支持truncate功能
-- 表级别的发布
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] [, ... ] ) ]
自带的逻辑的复制功能限制或缺点
  1. 逻辑解码是在主库上完成的,会消耗主库CPU
  2. 必须创建逻辑复制槽。但是逻辑复制槽会把主库的WAL给hold住,但是很多新手配置了逻辑复制,后来停掉了,但是忘记把逻辑复制槽给删掉,最后把主库空间给撑爆
  3. 逻辑复制槽不支持备库,如果使用流复制的高可用方案,主备库切换后,逻辑复制就废了
  4. 大事务会在主库中会生成一个临时文件,如果这个事务很大,这个临时文件也很大
  5. 需要把wal_level级别设置logical,这个会导致更多的WAL日志生成
4.pg10后函数和目录的改名:

##函数改名

  • pg_current_wal_lsn
  • pg_current_wal_insert_lsn
  • pg_current_wal_flush_lsn
  • pg_walfile_name_offset
  • pg_walfile_name
  • pg_wal_lsn_diff
  • pg_last_wal_receive_lsn
  • pg_last_wal_replay_lsn
  • pg_is_wal_replay_paused
  • pg_switch_wal
  • pg_wal_replay_pause
  • pg_wal_replay_resume
  • pg_ls_waldir

##目录名称改名

  • pg_xlog改为pg_wal
  • pg_clog改为pg_xact
5.索引的增强:
  • BRIN索引增强:
    • BRIN索引增加了存储选项autosummarize,可以自动计算摘要
    • 增强了函数brin_summarize_range()和brin_desummarize_range()可以手工为BRIN的指定块建摘要和去除摘要。以前BRIN只有函数brin_summarize_new_values(),gin_clean_pending_list()
    • improve accuracy in determinging if a BRIN index scan is beneficial
  • INET和CIDR类型上支持建SP-GIST类型索引
  • 在GIST索引的插入和更新可以更高小的重用空间
  • reduce page locking during vacuuming of GIN indexes

二、pg11版本新特性

  • 声明式分区表功能大大增加,分区表可以加主键,外键,索引,支持hash分区
  • JIT(即时编译功能),提供一些批计算如sum的性能,通常提升在10%左右
  • hash join支持并行
  • 支持存储过程(create procedure),并可以存储过程中嵌入事务
  • 存储过程中可以加commit和rollback事务
  • b-tree索引支持并行create index
  • create index使用include可以非键列放到索引中,以便covering index而不必要回表
  • 增加非空可瞬间完成,不需要rewrite表
  • vacuum增强:空闲空间可以更快的被重用,跳过一些没有必要的索引扫描
  • 提升了多个并发事务commit的性能
  • 逻辑复制支持truncate的同步
  • 以前触发的toast的压缩都需要插入的数据大于1996个字节时才会触发,这个1996字节是固定的,不能改,现在给表加了存储参数toast_tuple_target,可以设置更新的值就可以触发toast的压缩机制
  • 允许在initdb时改变WAL文件大小,以前是需要重新编译程序才能改变WAL文件的大小
  • 现在在WAL日志中会把使用的部分填0,这样可以额提高压缩率
  • 支持可通过grant权限下放系统权限
1.JIT
  • 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)

2.procedure中使用commit,rollback
  • pg11之前版本,function和procedure是一回事,但是从pg11开始就变得不一样了
  • pg11开始procedure的调用一定要使用call()函数调用,不能再使用select()函数调用了
  • pg11开始存储过程中可以调用commit和rollback功能
3.并行创建索引
  • pg11开始支持并行create index,默认开启,但是仅支持B-tree索引,其它类型索引现阶段不支持并行创建
postgres=# show max_parallel_maintenance_workers;
 max_parallel_maintenance_workers
----------------------------------
 2
(1 row)
4.快速增加包含非空默认值的列
  • pg11之前增加的一个包含非空默认值的字段,将会导致表数据的重新写入,为每一行添加该字段,并且填充默认值。对于大表则非常耗时

  • pg11开始增加非空字段则可以快速完成,只要通过在表pg_attribute中添加两个字段attfdwoptions和attmissingval。如果我非空行则attmissingval值为true,则说明不需要重写表。一旦表被重写,如执行vacuum full table操作,相应的attfdwoptions和attmissingval属性中值就会被清除,因为系统部在需要这些值。

5.grant权限下放四个系统函数和新增默认角色

##下放的四个系统函数

  • pg_ls_dir()
  • pg_read_file()
  • pg_read_binary_file()
  • pg_stat_file()

##新增默认角色

  • pg_read_server_files:具有数据库服务端文件的读权限
  • pg_write_server_files:具有数据库服务端文件的写权限
  • pg_execute_server_program:具有执行数据库服务端的程序权限

三、pg12新特性

  • 分区表DML性能增强,尤其是在分区数量比较多的情况下更为显著
  • pg12开始取消recovery.conf,把配置项移动到postgresql.conf中
  • 减少了在创建GIST,GIN,SP-GIST索引的WAL日志量
  • pg12默认开启JIT
  • 在btree索引中减少了不必要的多版本数据,提升了性能
  • vacuum增加了选项truncate,有可能不需要vacuum full也能释放部分空间到操作系统
  • max_wal_senders连接数从max_connections剥离
  • 支持在线重建索引,reindex concurrently
  • 提升了position函数的性能
  • serializable事务隔离级别,可以并行查询
1.取消recovery.conf
  • 在之前版本recovery.conf是单独的文件,用于备份恢复等创建,pg12开始将recover.conf配置合并至postgresql.conf文件中
  • 以前版本为了表明此库是备库,需要在$PGDATA下建standby.signal空文件。去掉了配置项standby_mode
  • 配置项trigger_file改名为promote_trigger_file
  • pg12只能同时复制配置恢复目标项的一项,不能同时配置:recovery_target,revovery_target_lsn,recovery_target_name,recovery_target_time,recovery_target_xid
  • pg_stat_replication中增加了应用延时字段:reply_time
2.btree索引优化的

pg12中将数据的物理地址ctid和索引存储在一起,成为索引的一部分。主键index scan速度更快,同时节省了index存储空间

  • 索引物理数据存储变得有序
  • 索引的物理页面的分隔不在从中间分隔,而是最右端分隔
  • 索引的物理页面分隔不在从中间分隔,而是最右端分割
3.新增视图和函数
  • pg_stat_progress_create_index:查看当前正在创建的索引进度,已经执行的数量块数量,已经执行的行数量,使用/等待锁的情况
  • pg_stat_progress_cluster:查看当前vacuum full/cluster进度,数据块读写数量,数据条目读写数量
  • pg_ls_archive_statusdir():列出归档状态文件内容
  • pg_promote():用于备库提升为主库
4.reindex concurrently
  • PG12之前版本重建索引通常是首先创建一个索引列相同的索引,之后删除旧的索引。pg12中reindex命令新增concurrently选项,从而支持在线重建索引。
  • reindex concurrently持有的是表级锁为show update exclusive锁,命令执行过程中不会阻塞表上的DML操作。相反如果没有concurrently则表级锁为share锁,会阻塞DML操作、
reindex concurrently原理步骤:
  1. 在线新建一个索引,相当于执行 CREATE INDEX CONCURRENTLY newindex ON table;
  2. 在线新建一个索引,相当于执行 CREATE INDEX CONCURRENTLY newindex ON table;
  3. 重命名新索引,相当于执行 ALTER INDEX newindex TO oldinex;
  4. 调整相关依赖关系
  5. 删除老索引,相当于执行 DROP INDEX CONCURRENTLY tmpindex

PS: 如果reindex concurrently命令执行失败,则状态标识为不可用"invalid",之后只能通过reindex index命名重建,因此会阻塞表上的DML操作。

四、pg13新特性

  • 分区表功能进一步加强
  • btree索引优化(引入deduplication技术)
  • 增量排序(incremental sorting)
  • 改变流复制的配置可以不用重启数据库
  • 聚合时使用hash算法可以ID使用磁盘做溢出存储
  • pg_stat_statements插件增加了选项可以跟踪sql的planning time,而不仅仅是执行时间
  • 支持并行vacuum
1.分区表性能

1). 逻辑复制支持分区
2). 更多的一些情况下可以对分区进行裁剪和智能join
3). 分区表可以支持before trigger(不允许改变插入数据的目标分区)
4). 可以显示地发布分区表,自动发布所有分区
5). 从分区表中添加/删除分区将自动从发布中添加/删除

2.btree索引优化

btree索引引入索引项去重技术,Deduplication。表中的列如果不是唯一的,可能会有很多相同的值,对应的B树索引也会有很多重复的索引记录。在pg13中索引借鉴了GIN索引的做法,将相同的key指向的对应行的ctid链接起来

3.增量排序
  • 当对一组数据集(x,y)按照x,y列进行组合排序,如果当前数据集已经按x进行了排序,这时,只需要对数据集按照x分组,并在每组对y列继续排序,就可以得到按照x,y排序的结果集。
  • 优缺点:对于特别大的数据集,会减少每次排序的数据量;但是,如果每个分组较大,分组数量较少时增量排序的代价会比较高。
  • 排序模式:1) 抓取相对安全的行数不需要检查之前的排序键进行全排,这里的安全是基于一些代价的考虑;2) 抓取所有行,基于之前的排序键上再进行分组排序
4.vacuum并行

在之前的版本中,每个表的vacuum操作并不能并行,当表比较大的时候,vacuum时间会很长,pg13支持对索引的并行vacuum,但存在较多限制

  • 目前仅限于索引,每个索引可以分配一个vacuum worker
  • 不支持在加上full选项后使用
  • 只有在至少有2个以上索引的表上使用parallel选项才有效
5.数据库管理上优化
  • reindexdb命令增加–jobs选项,允许用户并行重建索引
  • 引入了"可信插件"的概念,它允许超级用户指定一个普通用户可以安装的扩展
  • 增强数据库状态的监控,跟踪WAL日志的使用统计,基于流式备份的进度和analyze指令的执行进度
  • 支持pg_basebackup命令生成辅助清单文件,可以使用pg_verifybackup工具来验证备份的完整性
  • 可以限制为流复制槽所保留的WAL空间
  • 可以为standby设置临时流复制槽
  • pg_dump命令新增–include-foreign-data参数,可以实现在导出数据时导出外部数据封装器所引用的其他服务器上的数据
  • pg_rewind命令不仅可以在宕机后自动恢复,并且可以通过–write-recover-conf选项来配置pg备库,支持在目标实例上使用restore_command来获取所需的WAL日志

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

你可能感兴趣的:(postgresql,postgresql,数据库,database)