It appears undo at database startup is dependent on
- transactions_per_rollback_segment
- max_sessions
oracle (9.2.0 at least) uses the following formula to work out how many undo segments it uses when the undo tablespace is created.
max_rollback_segments = (max_sessions * 1.1) / transactions_per_rollback_segment
oracle will always have at least this number. We had the problem that max_sessions was changed and the undo tablespace was not recreated. Consequently the database was only ever creating what the old session level was set at.
We were also getting some weird errors around ORA-1555, snapshot too old errors when we kick a number of jobs off at once and they fail immediately with ORA-1555 errors.
We are in the process of making this change to production so time will tell !!!