Description
Original code in Sort.java
@Override public RelOptCost computeSelfCost(RelOptPlanner planner, RelMetadataQuery mq) { // Higher cost if rows are wider discourages pushing a project through a // sort. double rowCount = mq.getRowCount(this); double bytesPerRow = getRowType().getFieldCount() * 4; return planner.getCostFactory().makeCost( Util.nLogN(rowCount) * bytesPerRow, rowCount, 0);
The last line should be
return planner.getCostFactory().makeCost( rowCount/*rowCount*/, Util.nLogN(rowCount) * bytesPerRow/*cpu*/, 0/*io*/);
The wrong order will make the planner choose the wrong physical plan. For example, if the druid query has a limit of 10 with 10+ dimensions, the optimizer will choose not push the "limit" down to druid instead choose scanning entire data source in druid.
The fix is very easy, the gain is huge as the performance of the wrong plan is really bad. Hope it will be picked up by the next release.