Executando verificação de segurança...
1

O uso de merge fazia várias consultas para validar se as entidades já existiam.

Verifique se tem alguma forma de fazer merge em banco. No postgresql tem essa solução:

INSERT INTO order_items (
    id,
    quantity,
    price,
    created_at,
    updated_at
) values (
    @Id,
    @Quantity,
    @Price,
    NOW() AT TIME ZONE 'UTC',
    NOW() AT TIME ZONE 'UTC'
) ON CONFLICT (id) DO UPDATE SET
    quantity = EXCLUDED.quantity,
    price = EXCLUDED.price,
    updated_at = NOW() AT TIME ZONE 'UTC';";

Mysql:

INSERT INTO users (user_id, username, email)
VALUES (1, 'john_doe', '[email protected]')
ON DUPLICATE KEY UPDATE
    email = '[email protected]';

no postgres inclusive tem uma técnica de passar arrays para o banco (unnest), assim consigo incluir (ou atualizar) dezenas de registros com uma única query

Existe alguma outra forma mais eficiente e simples de lidar com esse tipo de timeout, especialmente em sistemas legados como esse?

Debug .. Identificar a causa raiz .. otimizar

Para não ser pego desprevenido: Observabilidade

Muitos sistemas ignoram completamente a observabilidade, mas é com ela que conseguimos identificar problemas de desempenho antes deles se tornarem críticos.

Carregando publicação patrocinada...
1

Nesse caso, o banco é um Oracle 10g, bastante antigo. Concordo com você que, para obter mais performance, o uso de SQL puro seria o caminho mais rápido.

No entanto, meu receio em seguir por essa abordagem está relacionado à auditoria que é aplicada nas entidades, pois ela também acaba impactando o tempo de execução.

Talvez a melhor solução seja utilizar SQL puro e realizar o INSERT manual na auditoria, mas fico receoso de acabar esquecendo algum campo ou regra, já que as classes são bem grandes e complexas.