How do you optimize Spark jobs for performance when handling extremely large, transactional datasets?