我遇到了表上缺少索引的问题,我收集线索的唯一方法是这样:
BEGIN TRANSACTION;
-- OVER 100 DELETES
COMMIT;
在 DBeaver 中,我仅选择了第一行和后续的删除,并执行了该操作。然后,选择提交行,执行它并等待,直到我觉得这花费了太长时间。
然后,当我取消事务时,DBeaver 给了我这条消息:
SQL Error [57014]: ERROR: canceling statement due to user request
Where: SQL statement "SELECT 1 FROM ONLY "schema"."table" x WHERE $1 OPERATOR(pg_catalog.=) "id_model" AND $2 OPERATOR(pg_catalog.=) "id_property1" AND $3 OPERATOR(pg_catalog.=) "id_property2" FOR KEY SHARE OF x"
id_model
是所有相关 DELETE 的 WHERE 子句。消息中提到的查询绝对不是我编写的代码,位于我能想到的任何函数/过程/触发器中的任何位置。
我从中得出,table
列上缺少索引id_property1
是id_property2
问题所在,显然确实如此。
当服务器正在处理事务中排队的多个语句时,是否有任何日志解释“幕后”发生的情况,我可以更轻松地找到该语句?
模型中配置了几个删除外键约束,所以我猜当索引丢失时,服务器需要一段时间才能找到正确的方法?