Changeset: 32ace0e31499 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/32ace0e31499
Modified Files:
        sql/backends/monet5/rel_pphash.c
        sql/server/rel_optimize_sel.c
        sql/server/rel_optimizer.c
        sql/server/rel_optimizer_private.h
Branch: pp_hashjoin
Log Message:

moving join2semijoin to later stage will improve join order


diffs (117 lines):

diff --git a/sql/backends/monet5/rel_pphash.c b/sql/backends/monet5/rel_pphash.c
--- a/sql/backends/monet5/rel_pphash.c
+++ b/sql/backends/monet5/rel_pphash.c
@@ -319,6 +319,7 @@ rel2bin_oahash_build(backend *be, sql_re
        if (!sub) return NULL;
 
        stmt *pp = get_pipeline(be);
+       assert(pp);
        /* BUILD HT */
        list *l = sa_list(be->mvc->sa);
        stmt *prnt = NULL;
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -2503,6 +2503,24 @@ rel_join2semijoin(visitor *v, sql_rel *r
                        }
                }
        }
+       /* simplify group join returning only columns of left into semijoin */
+       if (is_innerjoin(rel->op) && !list_empty(rel->attr)) {
+               int nr = 0;
+               for(node *n = rel->attr->h; n; n = n->next) {
+                       sql_exp *e = n->data;
+
+                       if (is_aggr(e->type))
+                               break;
+                       if (exp_is_atom(e))
+                               break;
+                       if (e->type == e_column && rel_find_nid(rel->l, e->nid))
+                               nr++;
+               }
+               if (nr == list_length(rel->attr)) {
+                       rel->op = op_semi;
+                       rel->attr = NULL;
+               }
+       }
        return rel;
 }
 
@@ -2585,7 +2603,7 @@ rel_optimize_joins_(visitor *v, sql_rel 
        uint8_t cycle = *(uint8_t*) v->data;
        rel = rel_push_join_exps_down(v, rel);
        rel = rel_out2inner(v, rel);
-       rel = rel_join2semijoin(v, rel);
+
        if (cycle > 0)
                rel = rel_push_join_down_outer(v, rel);
        return rel;
@@ -2608,6 +2626,30 @@ bind_optimize_joins(visitor *v, global_p
                   || gp->cnt[op_full] || gp->cnt[op_semi] || gp->cnt[op_anti]) 
&& (flag & optimize_joins) ? rel_optimize_joins : NULL;
 }
 
+static sql_rel *
+rel_joins_(visitor *v, sql_rel *rel)
+{
+       rel = rel_join2semijoin(v, rel);
+       return rel;
+}
+
+static sql_rel *
+rel_joins(visitor *v, global_props *gp, sql_rel *rel)
+{
+       v->data = &gp->opt_cycle;
+       rel = rel_visitor_topdown(v, rel, &rel_joins_);
+       v->data = gp;
+       return rel;
+}
+
+run_optimizer
+bind_joins(visitor *v, global_props *gp)
+{
+       (void)v;
+       return (gp->cnt[op_join] || gp->cnt[op_left] || gp->cnt[op_right] || 
gp->cnt[op_full] || gp->cnt[op_semi] || gp->cnt[op_anti]) ? rel_joins : NULL;
+}
+
+
 
 static void
 get_inner_relations(mvc *sql, sql_rel *rel, list *rels)
@@ -3050,6 +3092,13 @@ order_joins_bushy( visitor *v, list *rel
 {
        unsigned int rsingle;
 
+       /* split joins into n_m joins and filters (ie others with 1 side 
unique's (pkey/ukey etc) */
+       //for (node *n = exps->h; n; n = n->next) {
+               //sql_exp *je = n->data;
+               //if (find_prop(je->p, PROP_JOINIDX)) {
+                       //printf("join\n");
+               //}
+       //}
        /* loop of finding join pairs */
        allocator *ta = MT_thread_getallocator();
        int nr_exps = list_length(exps), nr_rels = list_length(rels), ci = 1;
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
@@ -607,7 +607,8 @@ const sql_optimizer post_sql_optimizers[
        {26, "remote_func", bind_remote_func},
        {27, "get_statistics", bind_get_statistics}, /* gather statistics */
        {28, "join_order2", bind_join_order2}, /* run join order one more time 
with statistics */
-       {29, "final_optimization_loop", bind_final_optimization_loop}, /* run 
select and group by order with statistics gathered  */
+       {29, "joins", bind_joins},      /* run joins optimizer (rewriting joins 
into semi's etc after ordering joins */
+       {23, "final_optimization_loop", bind_final_optimization_loop}, /* run 
select and group by order with statistics gathered  */
        { 0, NULL, NULL}
        /* If an optimizer is going to be added, don't forget to update 
NSQLREWRITERS macro */
 };
diff --git a/sql/server/rel_optimizer_private.h 
b/sql/server/rel_optimizer_private.h
--- a/sql/server/rel_optimizer_private.h
+++ b/sql/server/rel_optimizer_private.h
@@ -114,6 +114,7 @@ extern run_optimizer bind_final_optimiza
 extern run_optimizer bind_rewrite_remote(visitor *v, global_props *gp) 
__attribute__((__visibility__("hidden")));
 extern run_optimizer bind_rewrite_replica(visitor *v, global_props *gp) 
__attribute__((__visibility__("hidden")));
 extern run_optimizer bind_remote_func(visitor *v, global_props *gp) 
__attribute__((__visibility__("hidden")));
+extern run_optimizer bind_joins(visitor *v, global_props *gp) 
__attribute__((__visibility__("hidden")));
 
 /* these rewriters are shared by multiple optimizers */
 extern sql_rel *rel_split_project_(visitor *v, sql_rel *rel, int top) 
__attribute__((__visibility__("hidden")));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to