Changeset: 2b4c47f279af for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2b4c47f279af
Modified Files:
        sql/server/rel_optimizer.c
Branch: Jun2020
Log Message:

one more performance issue fixed.


diffs (62 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
@@ -2616,6 +2616,50 @@ has_no_selectivity(mvc *sql, sql_rel *re
        return rel;
 }
 
+/*
+ * Remove a redundant join
+ *
+ * join (L, Distinct Project(join(L,P) [ p.key == l.lkey]) [p.key]) [ p.key == 
l.lkey]
+ * =>
+ * join(L, P) [p.key==l.lkey]
+ */
+static sql_rel *
+rel_remove_redundant_join(mvc *sql, sql_rel *rel, int *changes)
+{
+       (void)sql;
+       if (is_join(rel->op) || is_semi(rel->op)) {
+               sql_rel *l = rel->l, *r = rel->r, *b, *p = NULL, *j;
+
+               if (is_basetable(l->op) && is_simple_project(r->op) && 
need_distinct(r)) {
+                       b = l; 
+                       p = r;
+                       j = p->l;
+               } else if (is_basetable(r->op) && is_simple_project(l->op) && 
need_distinct(l)) {
+                       b = r; 
+                       p = l;
+                       j = p->l;
+               }
+               if (!p || !j || !is_join(j->op))
+                       return rel;
+               /* j must have b->l (ie table) */
+               sql_rel *jl = j->l, *jr = j->r;
+               if ((is_basetable(jl->op) && jl->l == b->l) || 
+                   (is_basetable(jr->op) && jr->l == b->l)) {
+                       int left = 0;
+                       if (is_basetable(jl->op) && jl->l == b->l)
+                               left = 1;
+                       if (exp_match_list(j->exps, rel->exps)) {
+                               p->l = (left)?rel_dup(jr):rel_dup(jl);
+                               rel_destroy(j);
+                               set_nodistinct(p);
+                               (*changes)++;
+                               return rel;
+                       }
+               }
+       }
+       return rel;
+}
+
 static sql_column *
 is_fk_column_of_pk(sql_rel *rel, sql_column *pkc, sql_exp *e) /* test if e is 
a foreing key column for the pk on pkc */
 {
@@ -9161,6 +9205,7 @@ optimize_rel(mvc *sql, sql_rel *rel, int
                                rel = rel_visitor_bottomup(sql, rel, 
&rel_simplify_math, &changes);
                        rel = rel_visitor_bottomup(sql, rel, 
&rel_distinct_aggregate_on_unique_values, &changes);
                        rel = rel_visitor_bottomup(sql, rel, 
&rel_push_down_bounds, &changes);
+                       rel = rel_visitor_bottomup(sql, rel, 
&rel_remove_redundant_join, &changes);
                        rel = rel_visitor_bottomup(sql, rel, 
&rel_distinct_project2groupby, &changes);
                }
        }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to