pgAdmin 显示数据时速度慢?
pgAdmin slow when displaying data?
将一些 table 从 SQL Server 2008 移至 Postgres 后,我发现性能大幅下降,我想知道我是否缺少配置步骤,或者它是postgres 的这种行为很正常。
使用的查询是来自 table 的简单 SELECT。没有加入,没有排序,什么都没有。
table 本身只有大约 12K 行。
我已经在 3 台机器上试过了:
- 机器 A 硬件:50GB RAM,SSD 磁盘,CPU:Xeon® E5-2620v3(OS:
Ubuntu 服务器 16),数据库管理系统:Postgres 9.5
- 机器 B 硬件:8GB RAM,Sata 磁盘,CPU:至强 E5-4640(OS:
Ubuntu 服务器 12),数据库管理系统:Postgres 9.4
- 机器 C 硬件:4GB RAM,IDE 磁盘,CPU:至强 E3-1220v2(OS:
Windows服务器 2008),数据库管理系统:SQL服务器 2008 R2
尽管硬件和配置存在巨大差异,但我看到的这两个 Postgres 数据库的性能相似。怎么会这样?
机器A查询。请注意,我排除了几何列以便使用 "pure" 数据类型:
EXPLAIN ANALYZE VERBOSE SELECT id, "OID", type, name, orofos, xrisi_orofoy, area_sqm,
perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc,
xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY"
FROM public."korydallos_Land_Uses";
结果:
"Seq Scan on public."korydallos_Land_Uses" (cost=0.00..872.41 rows=12841 width=209) (actual time=0.025..13.450 rows=12841 loops=1)"
" Output: id, "OID", type, name, orofos, xrisi_orofoy, area_sqm, perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc, xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY""
"Planning time: 0.137 ms"
"Execution time: 14.788 ms"
这是 14 秒 一个简单的 select!!卧槽?将此与 SQL 服务器进行比较:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 1
Rows returned by SELECT statements 12840
Number of transactions 0
Network Statistics
Number of server roundtrips 1
TDS packets sent from client 1
TDS packets received from server 1040
Bytes sent from client 1010
Bytes received from server 2477997
Time Statistics
Client processing time 985
Total execution time 1022
Wait time on server replies 37
我对可能发生的事情一头雾水。我也试过:
- 正在检查死行:0
- 吸尘
- 只需查询主键 (!)。这需要 500ms 来执行。
对于我添加到 select 的每一列,添加了大约 500 毫秒
查询。
机器 A Postgres 性能设置:
max_connections = 200
shared_buffers = 12800MB
effective_cache_size = 38400MB
work_mem = 32MB
maintenance_work_mem = 2GB
min_wal_size = 4GB
max_wal_size = 8GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 500
机器 B Postgres 性能设置:
max_connections = 200
shared_buffers = 128MB
#effective_cache_size = 4GB
#work_mem = 4MB
#maintenance_work_mem = 64MB
#min_wal_size = 80MB
#max_wal_size = 1GB
#checkpoint_completion_target = 0.5
#wal_buffers = -1
#default_statistics_target = 100
Table Postgres 中的定义:
CREATE TABLE public."korydallos_Land_Uses"
(
id integer NOT NULL DEFAULT nextval('"korydallos_Land_Uses_id_seq"'::regclass),
wkb_geometry geometry(Polygon,4326),
"OID" integer,
type character varying(255),
name character varying(255),
orofos character varying(255),
xrisi_orofoy character varying(255),
area_sqm numeric,
perimeter_m numeric,
syn1_ numeric,
syn1_id numeric,
str_name character varying(255),
str_no character varying(255),
katanomh numeric,
linkc numeric,
xrcode character varying(255),
kat numeric,
ot character varying(255),
use character varying(255),
syn numeric,
notes character varying(255),
"MinX" numeric,
"MinY" numeric,
"MaxX" numeric,
"MaxY" numeric,
CONSTRAINT "korydallos_Land_Uses_pkey" PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public."korydallos_Land_Uses"
OWNER TO root;
CREATE INDEX "sidx_korydallos_Land_Uses_wkb_geometry"
ON public."korydallos_Land_Uses"
USING gist
(wkb_geometry);
编辑:删除了评论中建议的不相关的 SQL 服务器定义。保持时间,因为我认为它仍然相关。
根据评论,更多信息使用:
explain (analyze, verbose, buffers, timing) SELECT id, "OID", type, name, orofos, xrisi_orofoy, area_sqm,
perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc,
xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY"
FROM public."korydallos_Land_Uses"
结果:
"Seq Scan on public."korydallos_Land_Uses" (cost=0.00..872.41 rows=12841 width=209) (actual time=0.019..11.207 rows=12841 loops=1)"
" Output: id, "OID", type, name, orofos, xrisi_orofoy, area_sqm, perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc, xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY""
" Buffers: shared hit=744"
"Planning time: 1.073 ms"
"Execution time: 12.269 ms"
PG 管理员在 "Explain tab" 中向我展示了这个:
我如何测量 14 秒:
PG Admin 3的状态window,右下角,运行查询时。 (这里的巨魔说 14.3 秒)。
https://www.postgresql.org/docs/current/static/using-explain.html
Note that the “actual time” values are in milliseconds of real time,
所以在你的情况下
actual time=0.019..11.207
表示 运行 查询耗时 11 毫秒。
pgadmin "explain tab" 说的一样...现在,如果您在右下角看到 14.3 秒,而它所花费的时间确实是 14 秒(用手表测量),我认为这是网络上的一些可怕的延迟级别或 pgadmin 本身。例如在 psql 中尝试 运行 这个:
select clock_timestamp();
explain analyze select * FROM public."korydallos_Land_Uses";
select clock_timestamp();
这将显示服务器端的时间间隔 + 将命令从 psql 发送到服务器所需的时间 - 如果仍需要 14 秒 - 与您的网络管理员联系,如果没有,请尝试升级 pgadmin
将一些 table 从 SQL Server 2008 移至 Postgres 后,我发现性能大幅下降,我想知道我是否缺少配置步骤,或者它是postgres 的这种行为很正常。
使用的查询是来自 table 的简单 SELECT。没有加入,没有排序,什么都没有。 table 本身只有大约 12K 行。 我已经在 3 台机器上试过了:
- 机器 A 硬件:50GB RAM,SSD 磁盘,CPU:Xeon® E5-2620v3(OS: Ubuntu 服务器 16),数据库管理系统:Postgres 9.5
- 机器 B 硬件:8GB RAM,Sata 磁盘,CPU:至强 E5-4640(OS: Ubuntu 服务器 12),数据库管理系统:Postgres 9.4
- 机器 C 硬件:4GB RAM,IDE 磁盘,CPU:至强 E3-1220v2(OS: Windows服务器 2008),数据库管理系统:SQL服务器 2008 R2
尽管硬件和配置存在巨大差异,但我看到的这两个 Postgres 数据库的性能相似。怎么会这样?
机器A查询。请注意,我排除了几何列以便使用 "pure" 数据类型:
EXPLAIN ANALYZE VERBOSE SELECT id, "OID", type, name, orofos, xrisi_orofoy, area_sqm,
perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc,
xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY"
FROM public."korydallos_Land_Uses";
结果:
"Seq Scan on public."korydallos_Land_Uses" (cost=0.00..872.41 rows=12841 width=209) (actual time=0.025..13.450 rows=12841 loops=1)"
" Output: id, "OID", type, name, orofos, xrisi_orofoy, area_sqm, perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc, xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY""
"Planning time: 0.137 ms"
"Execution time: 14.788 ms"
这是 14 秒 一个简单的 select!!卧槽?将此与 SQL 服务器进行比较:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 1
Rows returned by SELECT statements 12840
Number of transactions 0
Network Statistics
Number of server roundtrips 1
TDS packets sent from client 1
TDS packets received from server 1040
Bytes sent from client 1010
Bytes received from server 2477997
Time Statistics
Client processing time 985
Total execution time 1022
Wait time on server replies 37
我对可能发生的事情一头雾水。我也试过:
- 正在检查死行:0
- 吸尘
- 只需查询主键 (!)。这需要 500ms 来执行。 对于我添加到 select 的每一列,添加了大约 500 毫秒 查询。
机器 A Postgres 性能设置:
max_connections = 200
shared_buffers = 12800MB
effective_cache_size = 38400MB
work_mem = 32MB
maintenance_work_mem = 2GB
min_wal_size = 4GB
max_wal_size = 8GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 500
机器 B Postgres 性能设置:
max_connections = 200
shared_buffers = 128MB
#effective_cache_size = 4GB
#work_mem = 4MB
#maintenance_work_mem = 64MB
#min_wal_size = 80MB
#max_wal_size = 1GB
#checkpoint_completion_target = 0.5
#wal_buffers = -1
#default_statistics_target = 100
Table Postgres 中的定义:
CREATE TABLE public."korydallos_Land_Uses"
(
id integer NOT NULL DEFAULT nextval('"korydallos_Land_Uses_id_seq"'::regclass),
wkb_geometry geometry(Polygon,4326),
"OID" integer,
type character varying(255),
name character varying(255),
orofos character varying(255),
xrisi_orofoy character varying(255),
area_sqm numeric,
perimeter_m numeric,
syn1_ numeric,
syn1_id numeric,
str_name character varying(255),
str_no character varying(255),
katanomh numeric,
linkc numeric,
xrcode character varying(255),
kat numeric,
ot character varying(255),
use character varying(255),
syn numeric,
notes character varying(255),
"MinX" numeric,
"MinY" numeric,
"MaxX" numeric,
"MaxY" numeric,
CONSTRAINT "korydallos_Land_Uses_pkey" PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public."korydallos_Land_Uses"
OWNER TO root;
CREATE INDEX "sidx_korydallos_Land_Uses_wkb_geometry"
ON public."korydallos_Land_Uses"
USING gist
(wkb_geometry);
编辑:删除了评论中建议的不相关的 SQL 服务器定义。保持时间,因为我认为它仍然相关。 根据评论,更多信息使用:
explain (analyze, verbose, buffers, timing) SELECT id, "OID", type, name, orofos, xrisi_orofoy, area_sqm,
perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc,
xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY"
FROM public."korydallos_Land_Uses"
结果:
"Seq Scan on public."korydallos_Land_Uses" (cost=0.00..872.41 rows=12841 width=209) (actual time=0.019..11.207 rows=12841 loops=1)"
" Output: id, "OID", type, name, orofos, xrisi_orofoy, area_sqm, perimeter_m, syn1_, syn1_id, str_name, str_no, katanomh, linkc, xrcode, kat, ot, use, syn, notes, "MinX", "MinY", "MaxX", "MaxY""
" Buffers: shared hit=744"
"Planning time: 1.073 ms"
"Execution time: 12.269 ms"
PG 管理员在 "Explain tab" 中向我展示了这个:
我如何测量 14 秒:
PG Admin 3的状态window,右下角,运行查询时。 (这里的巨魔说 14.3 秒)。
https://www.postgresql.org/docs/current/static/using-explain.html
Note that the “actual time” values are in milliseconds of real time,
所以在你的情况下
actual time=0.019..11.207
表示 运行 查询耗时 11 毫秒。
pgadmin "explain tab" 说的一样...现在,如果您在右下角看到 14.3 秒,而它所花费的时间确实是 14 秒(用手表测量),我认为这是网络上的一些可怕的延迟级别或 pgadmin 本身。例如在 psql 中尝试 运行 这个:
select clock_timestamp();
explain analyze select * FROM public."korydallos_Land_Uses";
select clock_timestamp();
这将显示服务器端的时间间隔 + 将命令从 psql 发送到服务器所需的时间 - 如果仍需要 14 秒 - 与您的网络管理员联系,如果没有,请尝试升级 pgadmin