RE: hash joins and pga/temp space?

"The memory allocated to a single SQL operator is limited to min(5%
PGA_AGGREGATE_TARGET, 100MB) for serial operations and for parallel
operations to min(30% PGA_AGGREGATE_TARGET/DOP, 5% PGA_AGGREGATE_TARGET,
100MB) (DOP=Degree of Parallelism). As you see you will never get more than
100MB for one sql operation. This 100 MB limit is in fact set by
_pga_max_size/2 where _pga_max_size = 200MB by default."

In 10gR2 at least, _PGA_MAX_SIZE is by default set to something like 2GB.

I don't have all the answers, but I did run into some issues with hash
joins degenerating into nested-loop joins when the record count
increased. I ended up cranking up the PGA_AGGREGATE_TARGET since I am
doing the auto-PGA thing (10.2.0.2/Solaris10), and it seemed to solve my
problem. I also added USE_HASH hints, but I *think* it will still do
something else if it does not have enough memory for the hash table.
Unfortunately I do not have a representative test system for this
warehouse style implementation.

Note that if you use the USE_HASH hint the smaller table should be the
first parameter.

I also recall reading that there are some upper limits for the hash_area
and sort_area memory sizes (200mb?) when using the auto-PGA, and some
undocumented parameters may be required for getting larger sizes. In my
case I was able to get away with adjusting PGA_AGGREGATE_TARGET up so
did not get into that.

There is some interested reading on hash joins (as well as sorting
costs, and lots of other things...) in Jonathan Lewis' book "Cost-Based
Oracle Fundamentals", which you may want to check out.