pgAdmin 显示数据时速度慢?

pgAdmin slow when displaying data?

将一些 table 从 SQL Server 2008 移至 Postgres 后,我发现性能大幅下降,我想知道我是否缺少配置步骤,或者它是postgres 的这种行为很正常。

使用的查询是来自 table 的简单 SELECT。没有加入,没有排序,什么都没有。 table 本身只有大约 12K 行。 我已经在 3 台机器上试过了:

尽管硬件和配置存在巨大差异,但我看到的这两个 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

我对可能发生的事情一头雾水。我也试过:

机器 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