首页 > 解决方案 > Postgres解释分析:总时间大大超过部分总和

问题描述

我有一个 python 脚本,它接收外部事件并将它们写入 Postgres 数据库。大多数情况下,INSERT 的运行速度非常快(< 0.3 秒)。但有时查询执行时间超过10-15秒!每分钟大约有 500 个事件,如此缓慢的行为是不可接受的。

查询很简单:

INSERT INTO tests (...) VALUES (...)

该表(大约有 500 万条记录)也很简单:
表测试

我在脚本中的“插入”之前添加了“解释分析”,它给了我这个:

Insert on tests  (cost=0.00..0.01 rows=1 width=94) (actual time=0.051..0.051 rows=0 loops=1)
  ->  Result  (cost=0.00..0.01 rows=1 width=94) (actual time=0.010..0.010 rows=1 loops=1)
Planning time: 0.014 ms
Execution time: 15624.374 ms

这怎么可能?我怎样才能知道这 15 秒在做什么?

我正在使用 Windows 服务器和 Postgres 9.6。Script 和 Postgres 在同一台机器上。

此外,我在此期间收集了 Windows 性能计数器的数据(磁盘队列长度、处理器时间),但它什么也没显示。

该服务器是 VMWare ESXi 上的虚拟服务器,但我不知道在这种情况下我可以检查什么。

添加

这些查询在多个线程中运行(几个并行脚本会这样做)。
INSERT无需显式事务即可完成。
没有触发器(有一个触发器,但我删除了它,没有任何改变),也没有外键。

如果你第二次执行它会怎样?

这个查询在几个脚本中执行,大约每分钟 400 次(总共)。而且大多数时候它执行得很快。我无法在查询工具中捕捉到这么长的执行时间。

pg_stat_activity下次看到这个我一定会尝试研究一下,谢谢。

标签: postgresqlpostgresql-9.6

解决方案


推荐阅读