为什么DDL语句经常挂起?

时间:2016-10-21 10:06:48

标签: postgresql

如果我们执行alter query(如添加约束或添加列)或更新列,Postgres会挂起并继续处理查询,从而使用永无止境的时间。

我们必须明确地终止查询。

为什么我们的ALTER语句经常被卡住?

1 个答案:

答案 0 :(得分:2)

这种查询有两种情况会长时间挂起:

  1. 这样的ALTER TABLE将需要对表进行ACCESS EXCLUSIVE锁定,这将阻止所有并发活动,并将被所有并发活动阻止。

    锁定请求将在等待该表锁定的事务队列的末尾排队,因此如果这些很多并且需要很长时间才能完成,ALTER TABLE将不得不等待很久。稍后在该表上请求锁定的其他事务也将挂起,因为它们在ALTER TABLE语句之后排队。

    请注意,“transacrion中空闲”或预准备语句的会话可能会持有很长时间的锁定。留下这些东西是错误的。

  2. 许多形式的ALTER TABLE必须重写表(例如,如果添加了具有非NULL默认值的新行)或扫描整个表(例如,如果添加了约束) ,必须检查每一行。

    如果表格很大,这可能需要很长时间才能完成。

  3. 要消除这两种情况之间的歧义,请查看pg_locks系统视图中的锁。