I set up a new filesystem on a stripe and added 5 smaller temp files rather than one big one.

I also added a huge pga_agg_target and its got a bit better but as each process only uses 5% of it, I've found its better to set the sort_area_size manually in the session and set workload to manual.

10g is way better with PGA than 9i