Eu tenho um caso de uso simples em que atualizo a tabela pai quando uma linha é inserida/excluída na tabela filho.
Suponha que temos uma tabela Products e uma tabela Items e ProductId é a chave estrangeira na tabela Items .
Sempre que um item é inserido ou excluído na tabela Itens , é feita uma atualização na tabela Produtos correspondente ao item. Uma atualização é simplesmente uma consulta como:
UPDATE "Products" SET "PropertyX" = $1, "UpdatedAt" = $2 WHERE "Id" = $3
Problema:
Se os itens inseridos/excluídos na tabela de itens corresponderem ao mesmo produto na tabela de produtos, a carga do banco de dados aumentará consideravelmente, causando tempos limite mesmo para 3K reqs/min devido a esperas de Lock:transactionid .
Eu testei isso no Aurora Postgres (com 4 CPUs, 16G Ram) e isso acontece mesmo que o número de linhas na tabela Items esteja na casa dos milhares e o número de linhas na tabela Products esteja nas centenas. Eu usei .net core com framework de entidade.
Meu conselho é usar um “gatilho de restrição deferida” para atualizar a
"Products"
tabela sempre que"Items"
for modificada.Esses gatilhos são
AFTER
gatilhos que não são executados imediatamente após a instrução, mas no final da transação.A vantagem aqui é que as linhas
"Products"
não serão bloqueadas por mais tempo do que o necessário, e sua simultaneidade será muito melhor.