当我删除Postgres中的一些记录时,查询运行时间过长

时间:2016-11-22 02:59:38

标签: sql postgresql sql-delete cascading-deletes

当我运行这行代码时。

DELETE from monthlyevaluatedbudgettable where budgetforyear = 2018;

它只是在状态栏Query is Running.中说,我认为它不会结束,所以我会取消它,然后在错误日志的消息中发出警告:

ERROR:  canceling statement due to user request
CONTEXT:  SQL statement "DELETE FROM ONLY "public"."monthlyadjustedbudgettable" WHERE $1 OPERATOR(pg_catalog.=) "budgetid""

********** Error **********

ERROR: canceling statement due to user request
SQL state: 57014
Context: SQL statement "DELETE FROM ONLY "public"."monthlyadjustedbudgettable" WHERE $1 OPERATOR(pg_catalog.=) "budgetid""

monthlyadjustedbudgettableON DELETE CASCADE之间monthlyevaluatedbudgettable的关系182,095。有人能告诉我会出现什么问题吗?

我在两个表中都有one-to-one个记录。他们的关系是paperImageView.contentMode = .scaleAspectFill

1 个答案:

答案 0 :(得分:1)

您应该首先尝试在当前查询中使用EXPLAIN来详细了解发生的情况。

我对您的删除查询速度如此之慢的预感是,您对ON DELETE CASCADE有一个monthlyadjustedbudgettable约束。这意味着对于monthlyevaluatedbudgettable中的每条记录,必须在monthlyadjustedbudgettable中进行检查,以查看是否还需要删除任何记录。由于该表上没有索引,因此可能会发生全表扫描。鉴于每张表中有大约200K条记录,这在所需时间方面可能非常大。

您可以尝试快速解决问题。您可以在monthlyadjustedbudgettable

中的外键列上添加索引
CREATE UNIQUE INDEX budget_idx ON monthlyadjustedbudgettable (budgetid);

这假设monthlyadjustedbudgettable中的外键列被称为budgetid

相关问题