如何禁用 postgresql 中的所有限制?

jor*_*ax2 3 c# postgresql entity-framework-core

我有一个 PostgreSQL 数据库,其中的表有超过 5000 亿行。我试图删除大约 600 万行,但需要 4 分钟以上。我需要优化那些删除操作以制作一个有用的系统。

我认为一个好主意可能是禁用约束和触发器,然后重新启用它,所以我的问题是:

如何禁用所有约束?并且,是否可以禁用表之间的关系?

现在,我只需使用以下方法禁用触发器:

Alter table "table_name" disable all
Run Code Online (Sandbox Code Playgroud)

并使用以下命令重新启用它:

Alter table "table_name" enable all
Run Code Online (Sandbox Code Playgroud)

编辑

这是启用触发器后的查询结果。

  Delete on "ParameterValues"  (cost=0.00..1015910.71 rows=47196359 width=6) (actual time=296995.938..296995.938 rows=0 loops=1)
  Buffers: shared hit=6000000 read=420811 dirtied=93346 written=51646
  ->  Seq Scan on "ParameterValues"  (cost=0.00..1015910.71 rows=47196359 width=6) (actual time=7977.126..19798.361 rows=6000000 loops=1)
        Filter: ("Id" < 23000000)
        Rows Removed by Filter: 34218414
        Buffers: shared read=420811 dirtied=49228 written=51646
Planning Time: 304.085 ms
Execution Time: 296995.963 ms
Run Code Online (Sandbox Code Playgroud)

禁用所有触发器可以提高性能,将执行时间从 5 分钟减少到 3 分钟。

Alter table "table_name" disable trigger all
Run Code Online (Sandbox Code Playgroud)

但是,我需要改进更多的删除操作。任何想法?

Lau*_*lbe 11

禁用表上所有触发器的正确​​语句是

ALTER TABLE atable DISABLE TRIGGER ALL;
Run Code Online (Sandbox Code Playgroud)

这将禁用表上定义的所有触发器和外键约束,因为外键约束是由 PostgreSQL 中的系统触发器实现的。

它还将禁用可延迟的主键、唯一和排除约束,这些约束也是通过触发器实现的。不可延迟的主键、唯一约束和排除约束没有关联的触发器,因此不受影响。

您稍后可以通过启用触发器来重新启用这些约束,但不会进行任何一致性检查。因为这很危险,所以禁用此类触发器需要超级用户权限。

禁用基于触发器的约束的另一种方法是将参数设置session_replication_rolereplica,这也需要超级用户权限。

禁用检查约束和不可延迟主键、唯一约束和排除约束的唯一方法是删除它们,然后重新创建它们。后者将花费一些时间,因为它会检查表的一致性,但您仍然可能会获胜,因为它会使数据修改更快。

有关参考,请参阅ALTER TABLE的文档。