summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorSergei Petrunia <psergey@askmonty.org>2019-08-23 00:57:40 +0300
committerSergei Petrunia <psergey@askmonty.org>2019-08-23 00:59:50 +0300
commitde2db8acf746eec785f40ff778251fd0aa3949ae (patch)
tree29674b9e3ff76fe4233f8734a08416120dba4cc1 /sql
parent235cf969d21ba3406a9325d952fda47c589e58d6 (diff)
downloadmariadb-git-bb-10.4-mdev20109.tar.gz
MDEV-20109: Optimizer ignores distinct key created for materialized...bb-10.4-mdev20109
Sj_materialization_picker::check_qep(): fix error in cost/fanout calculations: - for each join prefix, add #prefix_rows / TIME_FOR_COMPARE to the cost, like best_extension_by_limited_search does - Remove the fanout produced by the subquery tables. optimize_wo_join_buffering() (used by LooseScan and FirstMatch) - also add #prefix_rows / TIME_FOR_COMPARE to the cost of each prefix.
Diffstat (limited to 'sql')
-rw-r--r--sql/opt_subselect.cc5
-rw-r--r--sql/sql_select.cc3
2 files changed, 6 insertions, 2 deletions
diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc
index 599642b3a26..5daf4a4b04c 100644
--- a/sql/opt_subselect.cc
+++ b/sql/opt_subselect.cc
@@ -3082,11 +3082,14 @@ bool Sj_materialization_picker::check_qep(JOIN *join,
disable_jbuf, prefix_rec_count, &curpos, &dummy);
prefix_rec_count= COST_MULT(prefix_rec_count, curpos.records_read);
prefix_cost= COST_ADD(prefix_cost, curpos.read_time);
+ prefix_cost= COST_ADD(prefix_cost,
+ prefix_rec_count / (double) TIME_FOR_COMPARE);
+ //TODO: take into account join condition selectivity here
}
*strategy= SJ_OPT_MATERIALIZE_SCAN;
*read_time= prefix_cost;
- *record_count= prefix_rec_count;
+ *record_count= prefix_rec_count / mat_info->rows;
*handled_fanout= mat_nest->sj_inner_tables;
return TRUE;
}
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index e79e96bf210..546f1c420d5 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -16703,7 +16703,8 @@ void optimize_wo_join_buffering(JOIN *join, uint first_tab, uint last_tab,
reopt_remaining_tables &= ~rs->table->map;
rec_count= COST_MULT(rec_count, pos.records_read);
cost= COST_ADD(cost, pos.read_time);
-
+ cost= COST_ADD(cost, rec_count / (double) TIME_FOR_COMPARE);
+ //TODO: take into account join condition selectivity here
if (!rs->emb_sj_nest)
*outer_rec_count= COST_MULT(*outer_rec_count, pos.records_read);