我有一个 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 分钟。 …