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

Reply via email to