Eu tive um problema semelhante. Eu precisava excluir alguns milhões de registros antigos. A exclusão falhou após cerca de 30 minutos porque o espaço disponível para o arquivo de log era muito pequeno. Resolvemos isso modificando a instrução de exclusão para excluir apenas 500.000 registros por vez. Isso resolveu o problema.
Para aplicar esse conhecimento ao seu caso. Você pode executar algumas atualizações menores em vez de uma grande? Isso pode ser feito explicitamente adicionando as instruções 'begin transaction' e 'commit' em seu procedimento armazenado. Além das instruções no início e no final do procedimento armazenado, você pode emitir uma confirmação após um milhão de linhas e iniciar uma nova transação. Eu não faria um commit após cada atualização, pois isso diminuiria muito o desempenho. Outra opção seria limitar o procedimento armazenado a um determinado valor e chamá-lo várias vezes ou criar procedimentos armazenados semelhantes que funcionem em partes diferentes dos dados.
Como você não está usando explicitamente os limites da transação, talvez tenha alguma sorte em definir o nível de isolamento da transação para leituras não confirmadas. Veja aqui. Acho que isso pode acelerar o processamento, mas não espero que isso aconteça. ter um grande impacto no log de transação. Lembre-se de ativar as leituras sujas definindo o nível de isolamento para leituras não confirmadas.