[ 
https://issues.apache.org/jira/browse/DERBY-6211?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Rick Hillegas updated DERBY-6211:
---------------------------------

    Attachment: derby-6211-13-aa-SelectNode_optimizer.diff

Attaching derby-6211-13-aa-SelectNode_optimizer.diff. This patch moves the 
getOptimizer() method out of ResultSetNode down into SelectNode, the only 
subclass which actually calls it. The optimizer creation in SelectNode is 
balanced by a call to traceEndQueryBlock() just as was done to 
TableOperatorNode in the previous patch. I am running tests now.

At this point, the SelectNode and TableOperatorNode are the only nodes which 
create optimizers. This helps us reason about where optimizable query blocks 
occur and ensure that every optimizer creation is balanced with a call to 
traceEndQueryBlock() after join optimization via that optimizer is finished.

I would like to be able to hide or throw away the OptimizerImpl after join 
optimization is done. But that is not possible right now. Before explaining 
why, let me first sketch my current understanding of the phases of optimization:

1) Preprocessing. This is the phase in which the query is rewritten. Rewriting 
tasks include subquery flattening and putting predicates into conjunctive 
normal form.

2) Join optimization. Most of what we describe as optimization happens in this 
phase. It is the phase which selects join orders, join strategies, and access 
paths.

3) Projection and restriction. This is the phase in which predicates are pushed 
down as close to the row sources as possible. And rows are pruned back to the 
minimal number of columns needed by higher operators in the plan. The 
workhorses for this phase are the modifyAccessPath() methods. There is some 
other miscellaneous, mechanical processing in this phase related to the 
CostEstimates which were calculated during join optimization.

OptimizerImpl is responsible for phases (2) and (3). When a ResultSetNode is 
join optimized, the OptimizerImpl is saved away in ResultSetNode.optimizer so 
that it can be dug up later to perform projection and restriction. The 
OptimizerImpl used for join optimization retains information which is needed 
for projection and restriction.

I don't like the fact that the OptimizerImpl is stashed away. That makes it 
hard to reason about when join optimization is done. I hope that the 
traceEndQueryBlock() calls now mark the end of join optimization attempts. I 
would prefer to save just the projection/restriction and CostEstimate variables 
rather than the whole OptimizerImpl. But that's a rototill I don't want to 
embark on now.


Touches the following files:

-------------

M       java/engine/org/apache/derby/impl/sql/compile/ResultSetNode.java
M       java/engine/org/apache/derby/impl/sql/compile/SelectNode.java

Moves getOptimizer() down into SelectNode and adds a traceEndQueryBlock() call.

-------------

M       
java/testing/org/apache/derbyTesting/functionTests/tests/lang/XMLOptimizerTraceTest.java

Adds a test for xml-based optimizer tracing of outer joins.

                
> Make Optimizer trace logic pluggable.
> -------------------------------------
>
>                 Key: DERBY-6211
>                 URL: https://issues.apache.org/jira/browse/DERBY-6211
>             Project: Derby
>          Issue Type: Improvement
>          Components: SQL
>    Affects Versions: 10.11.0.0
>            Reporter: Rick Hillegas
>            Assignee: Rick Hillegas
>              Labels: derby_triage10_11
>         Attachments: derby-6211-01-aa-createPlugin.diff, 
> derby-6211-02-aa-cleanup.diff, derby-6211-02-ab-cleanup.diff, 
> derby-6211-03-aa-customTracer.diff, 
> derby-6211-04-aa-moveOptimizerTracerToEngineJar.diff, 
> derby-6211-05-aa-xmlOptimizerTracer.diff, 
> derby-6211-06-ab-packageProtect-XMLOptTrace.diff, 
> derby-6211-07-aa-useSchemaQualifiedNamesInSummaries.diff, 
> derby-6211-07-ab-useSchemaQualifiedNamesInSummaries.diff, 
> derby-6211-08-aa-fixNPE.diff, derby-6211-09-aa-addTests.diff, 
> derby-6211-10-aa-makingCostEstimateObject.diff, 
> derby-6211-11-aa-moveTracerOutOfOptimizer.diff, 
> derby-6211-11-ab-moveTracerOutOfOptimizer.diff, 
> derby-6211-12-aa-traceEndOfQueryBlock.diff, 
> derby-6211-13-aa-SelectNode_optimizer.diff
>
>
> Right now the trace logic in the optimizer is hard-coded to produce a stream 
> of diagnostics. It would be good to be able to plug alternative trace logic 
> into the optimizer. This would make the following possible:
> 1) Plug in trace logic which produces formats which are easier to study and 
> which can be analyzed mechanically. E.g., xml formatted output.
> 2) Plug in trace logic which can be used during unit testing to verify that 
> the optimizer has picked the right plan. Over time this might make it easier 
> to migrate canon-based tests to assertion-based tests.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to