额外时间未反映在PostgreSQL解释分析中?

额外时间未反映在PostgreSQL解释分析中?,postgresql,database-performance,Postgresql,Database Performance,在PostgreSQL中打开\计时,我可以看到命令运行所需的时间 我在两台机器上使用相同的数据库和索引运行了相同的查询,并且看到了非常不同的结果 在第一台机器上: machine1=# EXPLAIN ANALYZE INSERT INTO "notes" ("content", "date", "inserted_at", "updated_at", "user_id") VALUES ('Something of note', '2015-4-27', CURRENT_TIMESTAMP,

在PostgreSQL中打开\计时,我可以看到命令运行所需的时间

我在两台机器上使用相同的数据库和索引运行了相同的查询,并且看到了非常不同的结果

在第一台机器上:

machine1=# EXPLAIN ANALYZE INSERT INTO "notes" ("content", "date", "inserted_at", "updated_at", "user_id") VALUES ('Something of note', '2015-4-27', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1) RETURNING id;
                                     QUERY PLAN
---------------------------------------------------------------------------------------------
Insert on notes  (cost=0.00..0.03 rows=1 width=0) (actual time=0.055..0.055 rows=1 loops=1)
  ->  Result  (cost=0.00..0.03 rows=1 width=0) (actual time=0.016..0.016 rows=1 loops=1)
  Planning time: 0.048 ms
  Trigger for constraint notes_user_id_fkey: time=0.177 calls=1
  Execution time: 0.286 ms
(5 rows)

Time: 2.218 ms
在第二台机器上:

machine2=> EXPLAIN ANALYZE INSERT INTO "notes" ("content", "date", "inserted_at", "updated_at", "user_id") VALUES ('Something of note', '2015-4-27', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 1) RETURNING id;
                                     QUERY PLAN
---------------------------------------------------------------------------------------------
Insert on notes  (cost=0.00..0.01 rows=1 width=0) (actual time=0.049..0.049 rows=1 loops=1)
  ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.015..0.015 rows=1 loops=1)
  Planning time: 0.040 ms
  Trigger for constraint notes_user_id_fkey: time=0.118 calls=1
  Execution time: 0.196 ms
(5 rows)

Time: 86.452 ms
两个问题:

1为什么时间比计划+执行时间多

2额外的时间是由什么组成的,可能会在这些机器之间产生如此大的差异?

解释分析是一个服务器端命令。它报告服务器端执行时间。您可以选择将其作为EXPLAIN ANALYZE运行,如果您只想在运行时计时,则可以将其关闭,因为默认情况下在ANALYZE模式下启用的计时开销将使查询花费比不使用EXPLAIN ANALYZE时更长的时间

psql是一个客户端应用程序。Its\timing命令报告从发送查询到接收和处理结果的客户端运行时。重要的是,psql的计时结果受客户端/服务器往返时间的影响,而解释分析则不受影响

还有log_min_duration_语句,它告诉PostgreSQL在不进行分析的情况下记录服务器端查询的持续时间,同时仍将结果返回给客户端。您可以要求PostgreSQL使用SET client_min_messages='log';-但是,只有超级用户可以设置log_min_duration_语句,因为它同时影响日志记录和客户机报告,使其不太有用。如果客户端可以要求PostgreSQL在不需要超级用户的情况下发送服务器端定时信息和查询结果,那就太好了

从示例输出来看,您使用的是一个客户端连接到两台不同的机器。结果集数据大小基本相同。所以我想说,差别很可能是往返时间。Ping每个主机。

解释分析是一个服务器端命令。它报告服务器端执行时间。您可以选择将其作为EXPLAIN ANALYZE运行,如果您只想在运行时计时,则可以将其关闭,因为默认情况下在ANALYZE模式下启用的计时开销将使查询花费比不使用EXPLAIN ANALYZE时更长的时间

psql是一个客户端应用程序。Its\timing命令报告从发送查询到接收和处理结果的客户端运行时。重要的是,psql的计时结果受客户端/服务器往返时间的影响,而解释分析则不受影响

还有log_min_duration_语句,它告诉PostgreSQL在不进行分析的情况下记录服务器端查询的持续时间,同时仍将结果返回给客户端。您可以要求PostgreSQL使用SET client_min_messages='log';-但是,只有超级用户可以设置log_min_duration_语句,因为它同时影响日志记录和客户机报告,使其不太有用。如果客户端可以要求PostgreSQL在不需要超级用户的情况下发送服务器端定时信息和查询结果,那就太好了

从示例输出来看,您使用的是一个客户端连接到两台不同的机器。结果集数据大小基本相同。所以我想说,差别很可能是往返时间。Ping每个主机