Changeset: 61e78182ddc7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=61e78182ddc7 Modified Files: sql/server/rel_optimizer.c sql/server/rel_unnest.c Branch: Jun2020 Log Message:
Performance fix for tpcds q41. At rel_join2semijoin, if the single projection is a grouping column on an under relation, the re-write to semijoin can be made. Also fixed cardinality for grouping expressions after unnesting diffs (85 lines): diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c --- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -5399,22 +5399,33 @@ rel_remove_empty_join(mvc *sql, sql_rel return rel; } -/* const or groupby without group by exps */ -#define SIMPLE_PROJECTION_FOR_JOIN2SEMI(X) \ - ((X)->card < CARD_AGGR && is_project((X)->op) && list_length((X)->exps) == 1) +static inline bool +find_simple_projection_for_join2semi(sql_rel *rel) +{ + if (is_project(rel->op) && list_length(rel->exps) == 1) { + if (rel->card < CARD_AGGR) /* const or groupby without group by exps */ + return true; + sql_exp *found = rel_find_exp(rel->l, rel->exps->h->data); /* grouping column on inner relation */ + if (found && found->card <= CARD_AGGR) + return true; + } + return false; +} static sql_rel * -find_candidate_join2semi(sql_rel *rel, bool *swap) +find_candidate_join2semi(sql_rel *rel, bool *swap) { /* generalize possibility : we need the visitor 'step' here */ + if (rel_is_ref(rel)) + return NULL; if (rel->op == op_join && rel->exps) { sql_rel *l = rel->l, *r = rel->r; - if (SIMPLE_PROJECTION_FOR_JOIN2SEMI(r)) { + if (find_simple_projection_for_join2semi(r)) { *swap = false; return rel; } - if (SIMPLE_PROJECTION_FOR_JOIN2SEMI(l)) { + if (find_simple_projection_for_join2semi(l)) { *swap = true; return rel; } @@ -5464,7 +5475,7 @@ static sql_rel * rel_join2semijoin(mvc *sql, sql_rel *rel, int *changes) { (void)sql; - if ((is_simple_project(rel->op) || is_groupby(rel->op) || is_select(rel->op)) && rel->l) { + if ((is_simple_project(rel->op) || is_groupby(rel->op) || (is_select(rel->op) && !rel_is_ref(rel))) && rel->l) { bool swap = false; sql_rel *l = rel->l; sql_rel *c = find_candidate_join2semi(l, &swap); diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -1642,6 +1642,20 @@ exp_reset_card(mvc *sql, sql_rel *rel, s if (!e || !rel || !rel->l) return e; + if (is_groupby(rel->op)) { + switch(e->type) { + case e_aggr: + case e_column: + e->card = CARD_AGGR; + break; + case e_func: + case e_convert: + case e_cmp: + case e_atom: + case e_psm: + break; + } + } if (!is_simple_project(rel->op)) /* only need to fix projections */ return e; sql_rel *l; @@ -1657,7 +1671,7 @@ exp_reset_card(mvc *sql, sql_rel *rel, s case e_aggr: /* should have been corrected by rewrites already */ case e_cmp: case e_atom: - default: + case e_psm: break; } return e; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list