Tive um problema com a falta de um índice em uma tabela e a única maneira que tive de reunir pistas foi desta forma:
BEGIN TRANSACTION;
-- OVER 100 DELETES
COMMIT;
No DBeaver, selecionei apenas a primeira linha e as exclusões subsequentes, executei isso. Em seguida, selecionei a linha de commit, executei-a e esperei até sentir que estava demorando muito.
Então o DBeaver me deu esta mensagem quando cancelei a transação:
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
é a cláusula WHERE para todos os DELETEs em questão. A consulta mencionada na mensagem definitivamente não é um código escrito por mim, em qualquer lugar de qualquer função/procedimento/gatilho que eu possa imaginar.
Tirei disso que um índice ausente nas table
colunas id_property1
era id_property2
o problema, e aparentemente era.
Há algum log explicando o que está acontecendo "nos bastidores" quando o servidor está processando várias instruções enfileiradas na transação onde eu poderia ter encontrado essa instrução com mais facilidade?
Existem várias restrições de exclusão de chave estrangeira configuradas no modelo, então acho que quando os índices estão faltando, o servidor demora um pouco para encontrar a maneira correta de contornar.