在 postgres 9.2 (CentOS) 中,TRUNCATE TABLE 命令有时需要很长时间才能运行。有一次,截断一个有 100K 记录的表需要 1.5 多个小时,在其他情况下甚至更长。当我使用 pgAdmin 截断表时,也发生了这个问题。可能的原因是什么?以及如何提高截断性能?
服务器上有 16GB 内存,shared_buffers = 1536MB
在 postgres 9.2 (CentOS) 中,TRUNCATE TABLE 命令有时需要很长时间才能运行。有一次,截断一个有 100K 记录的表需要 1.5 多个小时,在其他情况下甚至更长。当我使用 pgAdmin 截断表时,也发生了这个问题。可能的原因是什么?以及如何提高截断性能?
服务器上有 16GB 内存,shared_buffers = 1536MB
TRUNCATE
必须刷新shared_buffers
被截断的表,并且必须取消链接旧文件,这在文件系统上可能会很慢,如ext3
.
不过,1.5 小时是相当极端的,因为我们通常最多只能说几秒钟。您很可能有其他会话持有表上的锁,从而阻止TRUNCATE
继续进行。见pg_catalog.pg_locks
和pg_catalog.pg_stat_activity
。
关于锁监控的 PostgreSQL wiki 文章应该很有用。
另请参阅:Postgresql 截断速度
检查是否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);
尝试断开与数据库的所有其他连接。我花了很长时间才截断 58000 条记录。
在我断开我的 postgres 数据库与 PyCharm DB Navigator 的连接后,开发服务器等总共花费了 118 毫秒。
这只是发生在我和我的团队身上。我们正在使用 Postgres 12,并且正在使用 Apache NiFi 进行一些处理。它卡住了。
我们做了一个:
systemctl status postgresql-12
然后我注意到很多“截断等待”我继续尝试重新加载 Postgres 但没有成功,然后只是杀死了每个卡住的进程。
在那之后它起作用了,我们能够重新开始工作,只花了不到一秒钟的时间。