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.
---