pg10、11、12版本特性

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

pg10、11、12版本特性
2. 分区表的改进
PostgreSQL 10 实现了声明式分区,PostgtreSQL 11完善了功能,PostgreSQL 12提升了性能。

我们知道在PostgreSQL 9.X时代需要通过表继承实现分区,这时还需要⼿⼯加触发器或规则把新插⼊的数据重新定向到具体的分区中,从PostgreSQL 10之后不需要这样了,直接⽤声明式分区就可以了,语法如下:
1. CREATE TABLE measurement (
2. city_id int not null,
3. logdate date not null,
4. peaktemp int,
5. unitsales int
6. ) PARTITION BY RANGE (logdate);
7.
8. CREATE TABLE measurement_y2006m02 PARTITION OF measurement
9. FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
分区表更具体的⼀些变化如下:
PostgreSQL11: 分区表增加哈希分区
PostgreSQL11:分区表⽀持创建主键、外键、索引、触发器
PostgreSQL11: 分区表⽀持UPDATE分区键,如果在分区表上创建了⼀个索引,PostgreSQL ⾃动为每个分区创建具有相同属性的索引。

PosgtreSQL 11 ⽀持为分区表创建⼀个默认(DEFAULT)的分区
对于 PostgreSQL 10 中的分区表,⽆法创建引⽤其他表的外键约束。

PostgreSQL 11 解决了这个限制,可以创建分区表上的外键。

在 PostgreSQL 10 中,分区上的索引需要基于各个分区⼿动创建,⽽不能基于分区的⽗表创建索引。

PostgreSQL 11 可以基于分区表创建索引。

如果在分区表上创建了⼀个索引,PostgreSQL ⾃动为每个分区创建具有相同属性的索引。

PostgreSQL 12后: ALTER TABLE ATTACH PARTITION不会阻塞查询
3. PostgreSQL 10版本的功能增强
3.1 PostgreSQL 10 新功能总结如下:
⽀持同步复制多个standby:Quorum Commit
PostgreSQL 10开始增加声明式分区
PostgreSQL 10 增加了并⾏功能
PostgreSQL 10之后 hash索引可以⾛流复制,从此可以⼤胆的使⽤hash索引了。

PostgreSQL 10之后提供了逻辑复制的功能:发布订阅的功能
PostgreSQL 10可以把多列组合在⼀起再建直⽅图,让⼀些关联列上的执⾏计划更准确
可以⽀持同步复制到多个standby,即Quorum Commit
以前的密码验证式md5,现在增加了安全级别更⾼的密码验证的⽅式:SCRAM-SHA-256
 3.2 并⾏查询功能:
实际上从9.6开始就有并⾏查询功能,但功能⽐较弱,到PostgreSQL 10版本之后,功能⼤⼤增强,后续的每个⼤版本或多或少都有功能增强。

并⾏的参数
max_parallel_workers=16;
max_parallel_workers_per_gather =4;
min_parallel_table_scan_size:只有表的⼤⼩⼤于此值时才需要并⾏,默认为8M,可以设置为1G或更⼤的值。

保持与9.X相同的⾏为,可以关闭并⾏
set max_parallel_workers_per_gather = 0
当需要并⾏时,可以⼿⼯设置max_parallel_workers_per_gather的值
max_parallel_maintenance_workers
3.3 逻辑复制功能
逻辑解码实际上是在PostgreSQL 9.4开始准备的功能,在9.X时代,⽀持内置了逻辑解码的功能,如果要做两个数据库之间表数据的逻辑同步,需要⾃⼰写程序或使⽤⼀些开源的软件来实现。

到PostgreSQL 10版本,原⽣提供了逻辑复制的功能,实现了逻辑发布和订阅的功能,逻辑复制的功能变化如下:
PostgreSQL 10版本不⽀持truncate的同步,导致在10版本中,作为逻辑同步的表不能做truncate。

从PostgreSQL 11版本之后可以⽀持truncate功能。

不过PostgreSQL⾃带的逻辑复制功能有以下限制:
逻辑解码是在主库上完成的,会消耗主库的CPU
必须建逻辑复制槽。

但是逻辑复制槽会把主库的WAL给hold住,很多新⼿配置了逻辑复制,后来停掉了,但是忘记把逻辑复制槽给删除掉,最后把主库空间给撑爆
逻辑复制槽不⽀持备库,如果使⽤流复制的⾼可⽤⽅案,主备库切换后,逻辑复制就废了。

⼤事务会在主库中会⽣成⼀个临时⽂件,如果这个事务很⼤,这个临时⽂件也很⼤。

需要把wal_level级别设置logical,这会导致更多的WAL⽇志⽣成。

实际上中启乘数科技开发的有商业版的逻辑复制软件CMiner,解决了以上问题。

CMiner本⾝是⼀个独⽴的程序,连接到主库上通过流复制协议拉取WAL⽇志,然后在本地解码,不会消耗主库的CPU,也不使⽤逻辑复制槽,没有把主库空间撑爆的风险,也可以⽅便的⽀持基于流复制的⾼可⽤⽅案,同时wal_level级别不需要设置为logical就可以完成解码。

⽬前这套解决⽅案已经在银⾏中使⽤,有兴趣同学可以加微信 osdba0,或邮件。

3.4 相关列上建组合的直⽅图统计信息
⽤实例说明这个功能:
1. create table test_t( a int4, b int4);
2. insert into test_t(a,b) select n%100,n%100 from generate_series(1,10000) n;
上⾯的两个列a和b的数据相关的,即基本是相同的,⽽PostgreSQL默认计算各列是按⾮相关来计算了,所以算出的的COST值与实际相差很⼤:
1. osdba=# explain analyze select * from test_t where a=1 and b=1;
2. QUERY PLAN
3. ----------------------------------------------------------------------------------------------------
4. Seq Scan on test_t (cost=0.00..19
5.00 rows=1 width=8) (actual time=0.034..0.896 rows=100 loops=1)
5. Filter: ((a = 1) AND (b = 1))
6. Rows Removed by Filter: 9900
7. Planning Time: 0.185 ms
8. Execution Time: 0.916 ms
如上⾯,估计出只返回1⾏,实际返回100⾏。

这在⼀些复杂SQL中会导致错误的执⾏计划。

这时我们可以在相关列上建组合的直⽅图统计信息:
1. osdba=# CREATE STATISTICS stts_test_t ON a, b FROM test_t;
2. CREATE STATISTICS
3. osdba=# analyze test_t;
4. ANALYZE
5. osdba=# explain analyze select * from test_t where a=1 and b=1;
6. QUERY PLAN
7. ------------------------------------------------------------------------------------------------------
8. Seq Scan on test_t (cost=0.00..195.00 rows=100 width=8) (actual time=0.012..0.830 rows=100 loops=1)
9. Filter: ((a = 1) AND (b = 1))
10. Rows Removed by Filter: 9900
11. Planning Time: 0.127 ms
12. Execution Time: 0.848 ms
13. (5 rows)
从上⾯可以看出当我们建了相关列上建组合的直⽅图统计信息后,执⾏计划中估计的函数与实际⼀致了。

3.5 ⼀些其它功能
hash索引从PostgreSQL 10开始可以放⼼⼤胆的使⽤:
PostgreSQL 9.X 版本hash索引⾛不了流复制,所以基本没有⼈⽤hash索引,即如果⽤了hash索引,在激活备库时,需要重建hash索引。

到PostgreSQL 10.X,hash索引可以通过流复制同步到备库,所以没有这个问题了,这是可以⼤胆的使⽤hash索引了。

到PostgreSQL 10之后,很多函数都进⾏了改名,其中把函数名中的“xlog”都改成了“wal”,把“position”都改成了“lsn”: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
PostgreSQL 10对⼀些⽬录也改名:
Rename write-ahead log directory pg_xlog to
rename transaction status directory pg_clog to pg_xact
PostgreSQL 9.X,同步复制只能⽀持⼀个同步的备库,PostgtreSQL 10 可以⽀持多个同步的standby,这称为“Quorum Commit”,同步复制的配置发⽣如下变化:
synchronous_standby_names
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)’
索引的增强:
BRIN索引增强:
BRIN索引增加了存储选项autosummarize,可以⾃动计算摘要
增加了函数brin_summarize_range()和brin_desummarize_range() 可以⼿⼯为BRIN的指定块建摘要和去除摘要。

以前BRIN只有函数brin_summarize_new_values()、 gin_clean_pending_list()
Improve accuracy in determining if a BRIN index scan is beneficial (David Rowley, Emre Hasegeli) INET和CIDR类型上⽀持建SP-GiST类型的索引
在GiST索引的插⼊和更新可以更⾼效的重⽤空间
Reduce page locking during vacuuming of GIN indexes
串⾏隔离级别预加锁阈值可控
max_pred_locks_per_relation:当单个对象的⾏或者页预加锁数量达到阈值时,升级为对象预加锁。

减少内存开销。

max_pred_locks_per_page:当单个页内多少条记录被加预加锁时,升级为页预加锁。

减少内存开销
PostgreSQL 10提供了视图pg_hba_file_rules⽅便查询访问控制的⿊⽩名单:
1. osdba=# select * from pg_hba_file_rules;
2. line_number | type | database | user_name | address | netmask | auth_method | options | error
3. -------------+-------+---------------+-----------+---------+---------+-------------+---------+-------
4. 80 | local | {all} | {all} | | | peer | |
5. 83 | host | {all} | {all} | 0.0.0.0 | 0.0.0.0 | md5 | |
6. 88 | local | {replication} | {all} | | | peer | |
psql增加了:\if, \elif, \else, and \endif.
1. SELECT
2.
3. EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
4.
5. EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
6.
7. \gset
8.
9. \if :is_customer
10.
11. SELECT * FROM customer WHERE customer_id = 123;
12.
13. \elif :is_employee
14.
15. \echo 'is not a customer but is an employee'
16.
17. SELECT * FROM employee WHERE employee_id = 456;
18.
19. \else
20.
21. \if yes
22.
23. \echo 'not a customer or employee'
24.
25. \else
26.
27. \echo 'this will never print'
28.
29. \endif
30.
31. \endif
其它的⼀些功能:
提升了聚合函数sum()、avg()、stddev()处理numeric类型的性能
Allow hashed aggregation to be used with grouping sets
Improve sort performance of the macaddr data type (Brandur Leach)
Add pg_stat_activity reporting of low-level wait states (Michael Paquier, Robert Haas, Rushabh Lathia)
This change enables reporting of numerous low-level wait conditions, including latch waits, file reads/writes/fsyncs, client reads/writes, and synchronous replication.
Show auxiliary processes, background workers, and walsender processes in pg_stat_activity (Kuntal Ghosh, Michael Paquier) This simplifies monitoring. A new column backend_type identifies the process type.
Prevent unnecessary checkpoints and WAL archiving on otherwise-idle systems (Michael Paquier)
Increase the maximum configurable WAL segment size to one gigabyte (Beena Emerson)
Add columns to to report replication delay times (Thomas Munro)
The new columns are write_lag, flush_lag, and replay_lag.
Allow specification of the recovery stopping point by Log Sequence Number (LSN) in (Michael Paquier)
Previously the stopping point could only be selected by timestamp or XID.
Improve performance of hot standby replay with better tracking of Access Exclusive locks (Simon Riggs, David Rowley) Speed up two-phase commit recovery performance (Stas Kelvich, Nikhil Sontakke, Michael Paquier)
Allow (Stephen Frost)
Add command to create a sequence matching an integer data type (Peter Eisentraut)
Allow the specification of a function name without arguments in DDL commands, if it is unique (Peter Eisentraut)
Improve speed of VACUUM’s removal of trailing empty heap pages (Claudio Freire, Álvaro Herrera)
Add full text search support for JSON and JSONB (Dmitry Dolgov)
The functions ts_headline() and to_tsvector() can now be used on these data types.
⾃增列原先只有⽤serial和bigserial创建⾃增列,现在可以标准的语法创建⾃增列
1. CREATE TABLE test01 (
2.
3. id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
4.
5. t text
6.
7. );
增加减号为jsonb类型的删除某个key的操作符
1. postgres=# select '{"a": 1, "b": 2, "c":3}'::jsonb - '{a,c}'::text[];
2.
3. ?column?
4.
5. \----------
6.
7. {"b": 2}
8.
9. (1 row)
Allow specification of in libpq connection strings and URIs (Robert Haas, Heikki Linnakangas)。

libpq will connect to the first responsive server in the list.
配合连接参数target_session_attrs=read-write,只是只会连接到⼀个主库上。

Allow to read from program output as well as files (Corey Huinker, Adam Gomaa)
In , push aggregate functions to the remote server, when possible (Jeevan Chalke, Ashutosh Bapat)
4. PostgreSQL 11版本的新特性
4.1 PostgreSQL 11版本的功能总结
总结如下:
JIT即时编译功能,提升⼀些批计算如SUM的性能,通常提升在10%左右。

存储过程中可以加commit或rollback事物
声明式分区表功能⼤⼤增强:分区表可以加主键、外键、索引,⽀持hash分区表
CREATE INDEX可以并⾏
增加⾮空列也是瞬间完成,不需要rewrite表
hash join⽀持并⾏
vacuum增强:空闲空间可以更快的被重⽤,跳过⼀些没有必要的索引扫描
提升了多个并发事务commit的性能
逻辑复制⽀持truncate的同步
⽀持存储过程(CREATE PROCEDURE),并可以在存储过程中嵌⼊事务
CREATE INDEX使⽤INCLUDE可以⾮键值列放到索引中,以便⾛Covering indexes⽽不必回表
以前触发toast的压缩都需要插⼊的数据⼤于1996个字节时才会触发,这个1996字节是固定的,不能改,现在给表加了存储参数,可以设置更新的值就可以触发toast的压缩机制
允许在initdb时改变 WAL⽂件的⼤⼩,以前是需要重新编译程序才能改变WAL⽂件的⼤⼩
现在在WAL⽇志中会把使⽤的部分填0,这样可以提⾼压缩率
4.2 PostgreSQL 11版本的jit
即时编译功能:
常⽤于CPU密集型SQL(分析统计SQL),执⾏很快的SQL使⽤JIT由于产⽣⼀定开销,反⽽可能引起性能下降
jit的参数:
jit = on
jit_provider = ‘llvmjit’
jit_above_cost= 100000
4.3 PostgtreSQL⼀些其它增强
新的变化:
可以⼿⼯调整复制槽的记录的位置:
Allow replication slots to be advanced programmatically, rather than be consumed by subscribers (Petr Jelinek)
This allows efficient advancement of replication slots when the contents do not need to be consumed. This is performed by pg_replication_slot_advance().
以前给表加有默认值的列时需要重写⽂件,现在不需要了
Allow ALTER TABLE to add a column with a non-null default without doing a table rewrite (Andrew Dunstan, Serge Rielau) This is enabled when the default value is a constant.
PostgreSQL 11版本的⼀些新特性
PostgreSQL11: 新增三个默认⾓⾊
PostgreSQL11: 可通过GRNAT权限下放的四个系统函数
PostgreSQL11: Initdb/pg_resetwal⽀持修改WAL⽂件⼤⼩
PostgreSQL11: 新增⾮空默认值字段不需要重写
–ALTER TABLE table_name ADD COLUMN flag text DEFAULT ‘default values’;
PostgreSQL11: Indexs With Include Columns
1. CREATE TABLE t_include(a int4, name text);
2. CREATE INDEX idx_t_include ON t_include USING BTREE (a) INCLUDE (name);
PostgreSQL11: initdb/pg_resetwal⽀持修改WAL⽂件⼤⼩,以前需要重新编译程序,才能改变。

PostgreSQL 10、11增加了⼀些系统⾓⾊,⽅便监控⽤户的权限:
PostgreSQL 11 新增三个默认系统⾓⾊,如下:
pg_read_server_files
pg_write_server_files
pg_execute_server_program
PostgreSQL 10
pg_read_all_settings
pg_read_all_stats
pg_stat_scan_tables
pg_monitor
PostgreSQL9.6只有⼀个系统⾓⾊:
pg_signal_backend
PostgreSQL 11 版本的psql中增加了命令\gdesc可以查看执⾏结果的数据类型:
1. osdba=# select * from test01 \gdesc
2. Column | Type
3. --------+---------
4. id | integer
5. id2 | integer
6. t | text
7. (3 rows)
PostgreSQL 11版本psql增加了五个变量更容易查询SQL执⾏失败的原因:
ERROR
SQLSTATE
ROW_COUNT
LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE
使⽤⽰例如下:
1. osdba=# select * from test01;
2. id | t
3. ----+-----
4. 1 | 111
5. 2 | 222
6. (2 rows)
7.
8. osdba=# \echo :ERROR
9. false
10. osdba=# \echo :SQLSTATE
11. 00000
12. osdba=# \echo :ROW_COUNT
13. 2
14. osdba=# select * from test02;
15. ERROR: relation "test02" does not exist
16. LINE 1: select * from test02;
17. ^
18. osdba=# \echo :ERROR
19. true
20. osdba=# \echo :SQLSTATE
21. 42P01
22. osdba=# \echo :LAST_ERROR_MESSAGE
23. relation "test02" does not exist
24. osdba=# \echo :LAST_ERROR_SQLSTATE
25. 42P01
5. PostgreSQL 12版本的新特性
5.1 新特性总结
特性如下:
PostgreSQL 12开始取消了recovery.conf,把配置项移动到postgresql.conf中
为了表明此库是备库,需要在$PGDATA下建standby.signal 空⽂件。

去掉了配置项standby_mode
配置项trigger_file改名为promote_trigger_file
PostgreSQL 12 只能同时配置恢复⽬标项的⼀项,不能同时配置:recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid
pg_stat_replication中增加了应⽤延迟时间字段: reply_time
减少了在创建GiST,GIN,SP-GiST索引的WAL⽇志量
max_wal_senders 连接数从 max_connections 剥离
⽀持在线重建索引:REINDEX CONCURRENTLY
在Btree索引中减少了不必要的多版本数据,提升了性能。

PG12默认开启了JIT
提升了position函数的性能
SERIALIZABLE事物事物隔离级别也可以并⾏查询
VACUUM增加了选项TRUNCATE,有可能不需要vacuum full也能释放部分空间到操作系统
分区表的性能得到了加强。

5.2 对VACUUM的增强:
1. osdba=# \h vacuum
2. Command: VACUUM
3. Description: garbage-collect and optionally analyze a database
4. Syntax:
5. VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
6. VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ]
7.
8. where option can be one of:
9.
10. FULL [ boolean ]
11. FREEZE [ boolean ]
12. VERBOSE [ boolean ]
13. ANALYZE [ boolean ]
14. DISABLE_PAGE_SKIPPING [ boolean ]
15. SKIP_LOCKED [ boolean ]
16. INDEX_CLEANUP [ boolean ]
17. TRUNCATE [ boolean ]
18.
19. and table_and_columns is:
20.
21. table_name [ ( column_name [, ...] ) ]
22.
23. URL: https:///docs/12/sql-vacuum.html
如上所⽰,增加了⼀些选项:
DISABLE_PAGE_SKIPPING:通常,VACUUM将基于可见性映射跳过页⾯。

如果.vm⽂件损坏,可以把这个参数设置为true.
SKIP_LOCKED:跳过⼀给锁定的,防⽌vacuum被hang
INDEX_CLEANUP: 默认是YES。

TRUNCATE:把⼀些未⽤连续的数据块空间释放给⽂件系统,相当与数据⽂件是⼀个稀疏⽂件,即在⼀些情况下不需要VACUUM FULL也能释放⼀些空间给⽂件系统。

其它的⼀些变化:
PostgreSQL 12版本之后:max_wal_senders 连接数从 max_connections 剥离
PostgreSQL 12 版本之后⽀持:REINDEX CONCURRENTLY
PostgreSQL12版本之后:减少了在创建GiST,GIN,SP-GiST索引的WAL⽇志量
PostgreSQL 12 只能配置⼀个:recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time,
recovery_target_xid.
pg_basebackup从PostgreSQL 10之后可以⽀持限流
6. PostgreSQL 13版本的新特性
6.1 新特性总结
总结如下:
对vacumm增加了并⾏的功能
改变流复制的配置可以不⽤重启数据库了
更多的⼀些情况下可以对分区进⾏裁剪和智能join
如原先智能join必须两个分区的范围精确相同,现在可以更智能了。

"">https:///message-
id/CAFjFpRdjQvaUEV5DJX3TW6pU5eq54NCkadtxHX2JiJG_GvbrCA@
三个表的full outer join也可以⾛wise join
分区智能join是从PostgreSQL 11版本添加的功能
分区表可以⽀持before trigger(不允许改变插⼊数据的⽬标分区)
分区表可以⽀持逻辑复制了
之前只能把分区表的各个分区单独的做为复制源,现在可以把分区表直接做为复制源。

先前订阅者只能把数据同步到⾮分区表,现在可以把数据同步到分区表
Allow whole-row variables (that is, table.*) to be used in partitioning expressions (Amit Langote)
⽀持异构分区表逻辑复制:
索引中重复的项做了优化处理,更节省空间。

重复的项只存储⼀次
聚合时使⽤hash算法可以使⽤磁盘做溢出存储
增量排序(Incremental sort)的功能
提升了PL/pgSQL中简单表达式的性能
pg_stat_statements插件增加了选项可以跟踪SQL的planning time,⽽不仅仅是执⾏时间
6.2 分区表智能join
6.2.1 不要求分区的范围完全相等
具体可见:
看例⼦:
1. create table t1(id int) partition by range(id);
2. create table t1_p1 partition of t1 for values from (0) to (100);
3. create table t1_p2 partition of t1 for values from (150) to (200);
4. create table t2(id int) partition by range(id);
5. create table t2_p1 partition of t2 for values from (0) to (50);
6. create table t2_p2 partition of t2 for values from (100) to (175);
然后我们分别在PostgreSQL 12版本和PostgreSQL 13执⾏下⾯的SQL:
1. explain select * from t1, t2 where t1.id=t
2.id;
对⽐如下:
6.2.2 三个分区表full outer join也智能join
看例⼦:
1. create table p (a int) partition by list (a);
2. create table p1 partition of p for values in (1);
3. create table p2 partition of p for values in (2);
4. set enable_partitionwise_join to on;
6.3 索引消除重复项
PostgreSQL 13中对索引的重复的项做了优化处理,更节省空间。

重复的项只存储⼀次。

看例⼦:
PG13索引的⼤⼩:
1. postgres=# create table test01(id int, id2 int);
2. CREATE TABLE
3. postgres=# insert into test01 select seq, seq / 1000 from generate_series(1, 1000000) as seq;
4. INSERT 0 1000000
5. postgres=# create index idx_test01_id2 on test01(id2);
6. CREATE INDEX
7. postgres=# \timing
8. Timing is on.
9. postgres=# select pg_relation_size('idx_test01_id2');
10. pg_relation_size
11. ------------------
12. 7340032
13. (1 row)
如果是PG9.6:
1. postgres=# select pg_relation_size('idx_test01_id2');
2. pg_relation_size
3. ------------------
4. 22487040
5. (1 row)
可以看到索引的⼤⼩是以前的三分之⼀。

索引中去除重复项的原理:
类似倒排索引GIN,⼀个索引的key值,对应多个物理⾏。

pg_upgrade升级数据库后,需要reindex才能让旧索引使⽤到此特性
有⼀些情况可能⽆法去除重复项:
numeric不能使⽤去重
jsonb类型不能使⽤去重
float4和float8不能使⽤去重
INCLUDE indexes不能使⽤去重
text, varchar, and char 类型的索引使⽤了⾮确定性排序(nondeterministic collation)
Container types (such as composite types, arrays, or range types) cannot use deduplication.
给索引增加了存储参数deduplicate_items以⽀持这个功能。

6.4 聚合时使⽤hash算法可以使⽤磁盘做溢出存储
以前当表特别⼤时,hash表超过work_mem的内存时,聚合时就⾛不到hash,只能⾛排序的算法,⽽排序聚合⽐hash聚合通常慢⼏倍的性
能,现在有了⽤磁盘存储溢出的hash表,聚合的性能⼤⼤提⾼
同时增加了参数hash_mem_multiplier,hasn聚合的内存消耗现在变成了work_mem* hash_mem_multiplier,默认此参数
hash_mem_multiplier为1,即hash表的⼤⼩还是以前的⼤⼩
现在使⽤了 HyperLogLog算法来估算唯⼀值的个数,减少了内存占⽤。

请看例⼦:
1. CREATE TABLE t_agg (x int, y int, z numeric);
2. INSERT INTO t_agg SELECT id % 2, id % 10000, random()
3. FROM generate_series(1, 10000000) AS id;
4. VACUUM ANALYZE;
5. SET max_parallel_workers_per_gather TO 0;
6. SET work_mem to '1MB';
7. explain analyze SELECT x, y, avg(z) FROM t_agg GROUP BY 1,2;
在12.4版本中聚合使⽤了排序算法,时间花了14.450秒,如下图所⽰:
⽽在13版本中,⾛了hash聚合,时间花了6.186秒,时间缩短了⼀半还多,如下图所⽰:
6.5 增量排序(Incremental sort)的功能
见我们的例⼦:
1. create table test01(n1 int, n2 int);
2. insert into test01 select seq/3, (seq / 97) % 100 from generate_series(1, 4000000) as seq;
3. create index idx_test01_n1 on test01(n1);
4. analyze test01;
然后分别在PostgreSQL 12版本和PostgreSQL 13版本下看下⾯SQL的执⾏计划和执⾏时间:
1. explain analyze select * from test01 order by n1, n2;
可以看到使⽤了增量排序后,速度更快了。

在PG13中为1.447秒,在PG12中为2.015秒:
6.6 vacumm增加了并⾏的功能
具体实现是SQL命令vacuum上增加了parallel的选项:
1. vacuum (parallel 5);
命令⾏⼯具vacuumdb增加了选项—parallel=:
1. vacuumdb -P 3
6.7 其它的⼀些功能增强
增强的功能如下:
增加参数autovacuum_vacuum_insert_threshold、 autovacuum_vacuum_insert_scale_factor:
原先如果对于只有insert的表(append only table)不会触发vacuum,这时会⼀直累积到aggressive v acuum,这样会导致
vacuum太不及时,现在有这个参数,解决了这个不及时的问题。

为了实现这个功能在pg_stat_all_tables表中增加了列n_ins_since_vacuum,记录⾃上⼀次vacuum以来这个表插⼊了多少
⾏。

reindexdb增加了—jobs,可以建多个数据库连接来并发来重建索引。

wal_skip_threshold
Skip WAL for new relfilenodes, under wal_level=minimal.
提升了PL/pgSQL中简单表达式的性能,如”x+1”或”x>0”,性能提升⼤致2倍
effective_io_concurrency参数
默认值改为1,与原先⼀样。

如果设置⼤于1的值,则为实际的并发IO
测试发现PostgreSQL在bitmap index scan时,如果要读⼊⼤量堆page,读IO的速度会远低于正常的顺序读,影响性能,这时可以把此值设置⼤。

允许的范围是 1 到 1000,或 0 表⽰禁⽤异步 I/O 请求。

当前这个设置仅影响位图堆扫描
jsonb @>
Less-silly selectivity for JSONB matching operators
pg_stat_slru 查看slru的统计信息
原⽂地址:http://www.pgsql.tech/article_101_10000102。

相关文档
最新文档