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]