环境信息
代码语言: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字端。