postgres truncate很慢

toa*_*ong 10 postgresql performance truncate centos

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

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

Cra*_*ger 16

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

1.5小时是非常极端的,因为我们通常最多只谈几秒钟.很可能你有其他会话持有表上的锁,阻止TRUNCATE进行.见pg_catalog.pg_locks和pg_catalog.pg_stat_activity.

关于锁监控的PostgreSQL wiki文章应该是有用的.

另请参见:Postgresql截断速度


小智 13

检查是否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));
Run Code Online (Sandbox Code Playgroud)

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