Daniel John Debrunner wrote:

I don't see anything ever being removed from these hashMaps. Is it
possible to remove entries at any time?

Yes, I think it is.

My first instinct is to say that it should be possible to remove hashMap entries once we determine that they are no longer needed. That said, there are two types of mappings that are added to a hashMap. The first uses instances of OptimizerImpl as the key, the second uses an optimizable query tree node (which is an instance of Optimizable) as the key. For the latter, the key can be a JoinNode, a UnionNode, a ProjectRestrictNode, or any other subclass of FromTable that does not override FromTable's "optimizeIt" method.

In the first case, I think we can say that the entries are no longer needed once the current round of optimization for the OptimizerImpl has completed. In other words, when the call to OptimizerImpl.getNextPermutation() returns "false", the Optimizer has finished the round of work and all "best access paths" have been stored in the query tree nodes beneath the OptimizerImpl. So it seems to me like that could be a good time to remove any relevant entries (meaning those which have the OptimizerImpl as their key) from the hash maps in the query tree nodes that make up the optimizableList.

In the second case, I think we can say that the entries are no longer needed after the check in OptimizerImpl.getNextDecoratedPermutation() has been performed and the appropriate action completed. In other words, after the following if block:

// If the previous path that we considered for curOpt was _not_ the best
// path for this round, then we need to revert back to whatever the
// best plan for curOpt was this round.  Note that the cost estimate
// for bestAccessPath could be null here if the last path that we
// checked was the only one possible for this round.
if ((curOpt.getBestAccessPath().getCostEstimate() != null) &&
        (curOpt.getCurrentAccessPath().getCostEstimate() != null))
{
...
}

Upon completion of this "if" block the hashMap entries that are keyed on curOpt have served their purpose (w.r.t to the subtree whose root is "curOpt") and can probably be removed, as well.

These are the answers that come to mind with very little investigation of the code--just based on my recollection of the code as I wrote it for DERBY-805.

Hopefully that answers your question; if not, please let me know what other info you need.

Army

Reply via email to