PostgreSQL IDE pgadmin , edb postgres enterprise manager 查询慢的问题分析

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: PostgreSQL 的GUI客户端比较多,有开源的,也有商业的。用得比较多的可能是PgAdmin了,有些人可能会用EDB的PEM。但实际上这两个GUI都有一个小问题,在返回较大的结果集时,会非常的慢。例如 : 数据库端创建一个表,插入约30MB数据。 postgres=> create

PostgreSQL 的GUI客户端比较多,有开源的,也有商业的。
用得比较多的可能是PgAdmin了,有些人可能会用EDB的PEM。
但实际上这两个GUI都有一个小问题,在返回较大的结果集时,会非常的慢。
例如 :
数据库端创建一个表,插入约30MB数据。

postgres=> create table test (like pg_class);
CREATE TABLE
postgres=> insert into test select * from pg_class;
INSERT 0 301
postgres=> insert into test select * from test;
INSERT 0 301
postgres=> insert into test select * from test;
INSERT 0 602
...
postgres=> insert into test select * from test;
INSERT 0 77056
postgres=> \dt+
                          List of relations
 Schema |      Name       | Type  | Owner  |    Size    | Description 
--------+-----------------+-------+--------+------------+-------------
 public | test            | table | digoal | 29 MB      | 
(3 rows)

使用EDB的PEM或者pgadmin连接到数据库 :
在GUI中执行 :

select * from test;

耗时20秒。

换个执行语句:

copy (select * from test) to stdout;
或者
copy test to stdout;

3秒返回。
copy与select * 查询的数据量一样多,而且都是全表扫描,但是时间却相差10几秒。

原因排查
在pgadmin客户端的机器上,观察到一个现象 :
执行select * from test;时,网络使用率不高,持续时间长。
网络传输结束后,CPU马上飙高,估计pgadmin在处理数据,很长一段时间后,才开始展示结果。
1
2
而更换为

copy (select * from test) to stdout;
或者
copy test to stdout;

后,执行非常迅速,而且展示也非常快,可以看到网络使用率很高,出现了一个尖峰。
3

将GUI客户端更换为heidisql后,执行 select * from test; 执行速度很快,与COPY相当。
从网络使用率来看,也出现了一个尖峰,数据很快就传完了。
4
使用 PostgreSQL 客户端 psql 命令执行select * from test,速度也和heidisql一样,很快。

对比以上几种情况,说明pgadmin和pem在处理 select 时,效果并不理想,如果要返回大量的结果集,请慎用。
如果使用PEM或者pgadmin要返回大量结果集,建议使用游标来返回:
例子:

begin;
declare c1 cursor for select * from test;  
fetch 100 from c1;  -- 这里不断的LOOP.

网络流量对比图 :
5
从左往右数
第1个尖峰,heidisql中执行select * from test;
第2个尖峰,pgadmin中执行copy (select * from test) to stdout;
第3个尖峰,pgadmin中执行copy test to stdout;
第4个尖峰,psql中执行select * from test;
说明 select * from test 的网络传输流量确实比copy的更大一些。
heidisql不支持 copy命令.
如果你用的是windows平台,并且遇到了与之类似的问题,建议排查一下客户端程序的代码,从程序层面来解决这个问题。
这个问题我也会反馈给pgadmin和EDB,看看他们怎么解决。

最后要给应用开发人员的一个小建议 :
查询大结果集,给用户展示数据的SQL,建议修改为用游标打开,一次FETCH少量数据, 拿到数据马上就可以向用户展示,后台可以根据策略选择是否再继续fetch剩余的数据。
这样做的好处是用户体验更好,同时有可能可以大大减少数据库的网络开销和CPU开销(因为用户并不一定要查询所有数据)如果用户关闭窗口,可以不再fetch其他数据。
大多数类似的应用场景,都是这样来设计的。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
SQL 关系型数据库 数据库
postgreSQL】pgAdmin
postgreSQL】pgAdmin
145 0
|
Ubuntu 关系型数据库 PostgreSQL
Docker Compose 部署 PostgreSQL 单机版——基于Ubuntu (含有pgadmin)
Docker Compose 部署 PostgreSQL 单机版——基于Ubuntu (含有pgadmin)
627 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL技术周刊第26期:vacuum freeze无法回收事务号问题分析
PostgreSQL(简称PG)的开发者们:云栖社区已有5000位PG开发者,发布了3000+PG文章(文章列表),沉淀了700+的PG精品问答(问答列表)。 PostgreSQL技术周刊会为大家介绍最新的PG技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅PostgreSQL技术周刊。
3730 0
|
Web App开发 关系型数据库 数据库
PostgreSQL/PPAS 一例死锁问题分析
PostgreSQL 死锁问题 本文分析在 PostgreSQL 发生的一例死锁问题 执行SQL 序列 表结构和数据 create table a(id int, value int); insert into a values(1,1); insert into
6002 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 子事务 id & command id 溢出问题分析
PostgreSQL 需要为每个savepoint或者函数的exception section分配子事务号,递增。 即使这个exception没有被触发,也需要一个子事务号。 PushTransaction@src/backend/access/transam/xact.c         /
5873 0
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
355 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
406 0
|
存储 算法 安全
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(下)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
373 0

相关产品

  • 云原生数据库 PolarDB