5

我们的 Postgres 9.2.4 服务器平均需要 0.69 秒(15000 条语句)来执行

SET CONSTRAINTS ALL DEFERRED 

为什么会这样?

这次会INITIALLY DEFERRED在表定义中使用而不是使用SET CONSTRAINTS ..消除还是将其隐藏在其他地方?

4

2 回答 2

4

我查看了源代码。本质上,SET CONSTRAINTS ALL DEFERRED除了设置一个全局变量并指出“所有适当的约束现在都被推迟”之外,什么都不做。唯一要做的重要工作是当有子事务在起作用时。如果这适用于您的情况,请尝试不使用。(注意子事务包括 PL/pgSQL 异常块。)

于 2013-09-23T17:21:34.810 回答
2

恕我直言,这可能是因为每次运行此语句时,在后台发生的是对位于 pg_catalog 中的表定义的大更新语句。换句话说,您将死行添加到 pg_catalog,这会导致在适当的 seq 扫描期间访问的磁盘空间越来越多。

如果您真的每天运行该语句 15k 次,也许您需要冷酷地审视您的架构或工作流程?

于 2013-08-28T10:29:41.993 回答