Github user maryannxue commented on a diff in the pull request:
https://github.com/apache/phoenix/pull/281#discussion_r151580119
--- Diff:
phoenix-core/src/main/java/org/apache/phoenix/optimize/QueryOptimizer.java ---
@@ -91,8 +91,23 @@ public QueryPlan optimize(PhoenixStatement statement,
SelectStatement select, Co
}
public QueryPlan optimize(QueryPlan dataPlan, PhoenixStatement
statement, List<? extends PDatum> targetColumns, ParallelIteratorFactory
parallelIteratorFactory) throws SQLException {
- List<QueryPlan>plans = getApplicablePlans(dataPlan, statement,
targetColumns, parallelIteratorFactory, true);
- return plans.get(0);
+ List<QueryPlan> plans = getApplicablePlans(dataPlan, statement,
targetColumns, parallelIteratorFactory, false);
+ if (plans.size() == 1) {
+ return plans.get(0);
+ }
+
+ // Get the best plan based on their costs. Costs will be ZERO if
stats are not
+ // available, thus the first plan will be returned.
+ Cost minCost = null;
+ QueryPlan bestPlan = null;
+ for (QueryPlan plan : plans) {
+ Cost cost = plan.getCost();
+ if (minCost == null || cost.compareTo(minCost) < 0) {
+ minCost = cost;
+ bestPlan = plan;
+ }
+ }
+ return bestPlan;
--- End diff --
Thanks for the feedback, @katameru! We need to define a strategy how hints
work in the cost-based optimizer mode. Your input would be very much
appreciated!
Since this is the first issue in which I've brought "cost-based" in, the
idea is to plug-in the framework and pieces of code here and there needed to
make it work in general. We can see there's still a lot to do to refine this
framework, and as I dig further into other issues under PHOENIX-4313. Right now
I think adding a option to disable cost-based optimizer (pls see my latest ci)
should be enough.
---