Seu melhor desempenho será se você puder codificar seus "testes" na própria lógica SQL, para que você possa reduzir tudo a um punhado de instruções UPDATE. Ou pelo menos faça o maior número possível dessa maneira, para que menos linhas precisem ser atualizadas individualmente.
Por exemplo:
UPDATE tablename set firstname = [some logic]
WHERE [logic that identifies which rows need the firstname updated];
Você não descreve muito sobre seus testes, então é difícil ter certeza. Mas você normalmente pode obter bastante lógica em sua cláusula WHERE com um pouco de trabalho.
Outra opção seria colocar sua lógica em um procedimento armazenado. Você ainda estará fazendo 350.000 atualizações, mas pelo menos elas não estão todas "passando pela rede". Eu usaria isso apenas como último recurso; a lógica de negócios deve ser mantida na camada do aplicativo sempre que possível, e os procedimentos armazenados tornam seu aplicativo menos portátil.