PostgreSQL创建临时表性能下降分析

2020-06-09 10:20:17 浏览数 (1)

环境信息

代码语言:txt复制
PostgreSQL 11.5

问题

代码语言:txt复制
客户反馈临时表创建耗时较长,平均耗时在5ms以上,相对于之前测试阶段的创建时间有明显变慢。

根本原因

代码语言:txt复制
postgresql在创建表时,会预估当前表是否存在超长记录的可能,如果使用了text,varchar(555)等超大字端,会在创建表同时创建toast表及toast索引表,同时多字段会写入系统表记录,这将增大创建表的开销。

诊断步骤

代码语言:txt复制
psql

postgres=# select count(*) from pg_class;
 count 
-------
   403
(1 row)

postgres=# create temp table t1(id int);
CREATE TABLE
postgres=# select count(*) from pg_class;
 count 
-------
   404
(1 row)

postgres=# create temp table t2(id text);  
CREATE TABLE
postgres=# select count(*) from pg_class;
 count 
-------
   407
(1 row)

postgres=# select oid from pg_class where relname='t2'; 
  oid  
-------
 16515
(1 row)

postgres=# select relname from pg_class where relname like '515%';
       relname        
----------------------
 pg_toast_16515
 pg_toast_16515_index
(2 rows)

postgres=# 
同时,pg_index,pg_constraint,pg_type,pg_attribute等系统表也会随着表字段数增加而写入更多的数据,而客户环境上还部署有逻辑复制槽,这会进一步加剧系统表的膨胀问题,导致插入速度的降低,影响创建临时表的创建

解决方法

代码语言:txt复制
建议尽量减少字端数量,尽可能精确描述字段最大长度,减少使用varchar超长字段,以及text字端。

0 人点赞