【发布时间】:2019-05-29 16:00:55
【问题描述】:
我有一个 PostgreSQL 数据库,其中包含超过 5000 亿行的表。我正在尝试删除大约 600 万行,但这需要超过 4 分钟。我需要优化那些删除操作以制作一个有用的系统。
我认为一个好主意是禁用约束和触发器,然后再启用它,所以我的问题是:
如何禁用所有约束? 而且,是否可以禁用表之间的关系?
现在,我只是用这个来禁用触发器:
Alter table "table_name" disable all
然后使用它重新启用它:
Alter table "table_name" enable all
编辑
这是启用触发器的查询结果。
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
禁用所有触发器可以提高性能,将执行时间从 5 分钟减少到 3 分钟。
Alter table "table_name" disable trigger all
但是,我需要改进更多的删除操作。有什么想法吗?
【问题讨论】:
标签: c# postgresql entity-framework-core