Su mejor rendimiento será si puede codificar sus "pruebas" en la propia lógica SQL, de modo que pueda reducir todo a un puñado de instrucciones UPDATE. O al menos hacer la mayor cantidad posible de esa manera, de modo que sea necesario actualizar menos filas individualmente.
Por ejemplo:
UPDATE tablename set firstname = [some logic]
WHERE [logic that identifies which rows need the firstname updated];
No describe mucho sobre sus pruebas, por lo que es difícil estar seguro. Pero, por lo general, puede obtener bastante lógica en su cláusula WHERE con un poco de trabajo.
Otra opción sería poner su lógica en un procedimiento almacenado. Todavía estarás haciendo 350,000 actualizaciones, pero al menos no todas "pasarán por el cable". Sin embargo, usaría esto solo como último recurso; la lógica empresarial debe mantenerse en la capa de la aplicación siempre que sea posible, y los procedimientos almacenados hacen que su aplicación sea menos portátil.