我们的 Postgres 9.2.4 服务器平均需要 0.69 秒(15000 条语句)来执行
SET CONSTRAINTS ALL DEFERRED
为什么会这样?
这次会INITIALLY DEFERRED
在表定义中使用而不是使用SET CONSTRAINTS ..
消除还是将其隐藏在其他地方?
我们的 Postgres 9.2.4 服务器平均需要 0.69 秒(15000 条语句)来执行
SET CONSTRAINTS ALL DEFERRED
为什么会这样?
这次会INITIALLY DEFERRED
在表定义中使用而不是使用SET CONSTRAINTS ..
消除还是将其隐藏在其他地方?
我查看了源代码。本质上,SET CONSTRAINTS ALL DEFERRED
除了设置一个全局变量并指出“所有适当的约束现在都被推迟”之外,什么都不做。唯一要做的重要工作是当有子事务在起作用时。如果这适用于您的情况,请尝试不使用。(注意子事务包括 PL/pgSQL 异常块。)
恕我直言,这可能是因为每次运行此语句时,在后台发生的是对位于 pg_catalog 中的表定义的大更新语句。换句话说,您将死行添加到 pg_catalog,这会导致在适当的 seq 扫描期间访问的磁盘空间越来越多。
如果您真的每天运行该语句 15k 次,也许您需要冷酷地审视您的架构或工作流程?