Aakash Bordia wrote:
I wanted to mention that I am in the debugger, and whatever I asked was
in context of that (that is while debugging the code, I am not sure
where to find the access path in the QTN once the optimize method is
done with. Same for the second question).
<snip>
> 1) I am not sure where to look for the accesspath(both base tables and
> join),
If you're looking for the *final* join strategies, index choices, and join order
for a query, then one option is to set the derby.language.logQueryPlan property
to "true". Then after you execute a query and close the result set, the full
query plan will be printed to the "derby.log" file. For large queries the plan
can be a bit unruly, but generally speaking you can find the join strategy, join
order, and choice of conglomerate (index or base table) along with other scan
information from that plan.
> as the values in AccessPathImpl (at join or PRN or base table
> level) seem un-intuitive.
AccessPathImpl is in fact the description of the access path for a given node.
This object shows you the join strategy and conglomerate choice (index or base
table) for a query tree node. The latter (conglomerate) only applies to base
tables. The "conglomerate descriptor" within AccessPathImpl can be used to
determine whether or not it's an index, and if so, which one.
If you're looking for the access path after optimization is complete, then you
might want to put a breakpoint in DMLStatementNode.optimizeStatement(), right
after the line which says:
resultSet = resultSet.modifyAccessPaths()
When "modifyAccessPaths()" returns, all decisions regarding access paths have
been made and have been saved within each query tree node. So then you can
examine the tree rooted at "resultSet" to see all of the information you want.
Look for the "trulyTheBestAccessPath" field for a given node; if that field is
null or if it doesn't have the information you need, then the node probably has
one or more children at which you should look.
Note that if you are examining access paths *during* optimization, then
"trulyTheBestAccessPath" will not be set. Instead you should look at the
"currentAccessPath" and "bestAccessPath" fields.
That said, trulyTheBestAccessPath (along with the other access path fields) is
in fact an instance of AccessPathImpl, so if you find that to be non-intuitive,
then perhaps your best bet is to use the query plan logging mentioned above?
> 2) Also it seems we hang the Level2OptimizerImpl objects off of the
> base table FromBaseTable, but I dont see it up in the tree anywhere.
> Is there a reason for this?
I'm not sure I understand what this question is asking; can you rephrase it?
I'm glad to see that you are interested in the optimizer. If you are looking
for more details about how things work (or how are they supposed to work), you
might want to take a look at the following page from the Derby wiki:
http://wiki.apache.org/db-derby/LanguageOptimize
That may help you figure out where to trace while debugging, as well. If you
have any questions, please feel free to ask.
Army