13

在 postgres 9.2 (CentOS) 中,TRUNCATE TABLE 命令有时需要很长时间才能运行。有一次,截断一个有 100K 记录的表需要 1.5 多个小时,在其他情况下甚至更长。当我使用 pgAdmin 截断表时,也发生了这个问题。可能的原因是什么?以及如何提高截断性能?

服务器上有 16GB 内存,shared_buffers = 1536MB

4

4 回答 4

17

TRUNCATE必须刷新shared_buffers被截断的表,并且必须取消链接旧文件,这在文件系统上可能会很慢,如ext3.

不过,1.5 小时是相当极端的,因为我们通常最多只能说几秒钟。您很可能有其他会话持有表上的锁,从而阻止TRUNCATE继续进行。见pg_catalog.pg_lockspg_catalog.pg_stat_activity

关于锁监控的 PostgreSQL wiki 文章应该很有用。

另请参阅:Postgresql 截断速度

于 2013-11-12T23:38:38.780 回答
14

检查是否truncate被任何查询阻止

SELECT
    activity.pid,
    activity.usename,
    activity.query,
    blocking.pid AS blocking_id,
    blocking.query AS blocking_query
FROM pg_stat_activity AS activity
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(activity.pid));

如有必要终止它 SELECT pg_terminate_backend(PID);

于 2019-06-01T23:08:17.700 回答
3

尝试断开与数据库的所有其他连接。我花了很长时间才截断 58000 条记录。

在我断开我的 postgres 数据库与 PyCharm DB Navigator 的连接后,开发服务器等总共花费了 118 毫秒。

于 2018-03-06T11:12:28.243 回答
1

这只是发生在我和我的团队身上。我们正在使用 Postgres 12,并且正在使用 Apache NiFi 进行一些处理。它卡住了。

我们做了一个:

systemctl status postgresql-12

然后我注意到很多“截断等待”我继续尝试重新加载 Postgres 但没有成功,然后只是杀死了每个卡住的进程。

在那之后它起作用了,我们能够重新开始工作,只花了不到一秒钟的时间。

于 2020-10-21T17:02:08.383 回答