Changeset: 16fa9f037242 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=16fa9f037242
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
Branch: Jul2015
Log Message:

improved join order rewrite by including the weight of the underlying
select operators (only enabled with --set sql_debug=16 for now)


diffs (111 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
@@ -306,9 +306,8 @@ get_relations(sql_rel *rel, list *rels)
 }
 
 static int
-exp_count(int *cnt, int seqnr, sql_exp *e) 
-{
-       (void)seqnr;
+exp_count(int *cnt, sql_exp *e) 
+{
        if (!e)
                return 0;
        if (find_prop(e->p, PROP_JOINIDX))
@@ -320,10 +319,10 @@ exp_count(int *cnt, int seqnr, sql_exp *
        switch(e->type) {
        case e_cmp:
                if (!is_complex_exp(e->flag)) {
-                       exp_count(cnt, seqnr, e->l); 
-                       exp_count(cnt, seqnr, e->r);
+                       exp_count(cnt, e->l); 
+                       exp_count(cnt, e->r);
                        if (e->f)
-                               exp_count(cnt, seqnr, e->f);
+                               exp_count(cnt, e->f);
                }       
                switch (get_cmp(e)) {
                case cmp_equal:
@@ -390,7 +389,7 @@ static int
 exp_keyvalue(sql_exp *e) 
 {
        int cnt = 0;
-       exp_count(&cnt, 0, e);
+       exp_count(&cnt, e);
        return cnt;
 }
 
@@ -555,12 +554,26 @@ find_basetable( sql_rel *r)
        }
 }
 
+static int
+exps_count(list *exps) 
+{
+       node *n;
+       int cnt = 0;
+
+       if (!exps)
+               return 0;
+       for (n = exps->h; n; n=n->next)
+               exp_count(&cnt, n->data);
+       return cnt;
+}
+
 static list *
-order_join_expressions(sql_allocator *sa, list *dje, list *rels)
-{
-       list *res = sa_list(sa);
+order_join_expressions(mvc *sql, list *dje, list *rels)
+{
+       list *res = sa_list(sql->sa);
        node *n = NULL;
        int i, j, *keys, *pos, cnt = list_length(dje);
+       int debug = mvc_debug_on(sql, 16);
 
        keys = (int*)malloc(cnt*sizeof(int));
        pos = (int*)malloc(cnt*sizeof(int));
@@ -574,9 +587,9 @@ order_join_expressions(sql_allocator *sa
                        sql_rel *r = find_rel(rels, e->r);
 
                        if (l && is_select(l->op) && l->exps)
-                               keys[i] += list_length(l->exps)*10;
+                               keys[i] += list_length(l->exps)*10 + 
exps_count(l->exps)*debug;
                        if (r && is_select(r->op) && r->exps)
-                               keys[i] += list_length(r->exps)*10;
+                               keys[i] += list_length(r->exps)*10 + 
exps_count(r->exps)*debug;
                }
                pos[i] = i;
        }
@@ -721,7 +734,7 @@ find_fk( mvc *sql, list *rels, list *exp
        }
 
        /* sort expressions on weighted number of reducing operators */
-       sdje = order_join_expressions(sql->sa, dje, rels);
+       sdje = order_join_expressions(sql, dje, rels);
        return sdje;
 }
 
@@ -965,7 +978,7 @@ reorder_join(mvc *sql, sql_rel *rel)
                cnt = list_length(exps);
                rel->exps = find_fk(sql, rels, exps);
                if (list_length(rel->exps) != cnt) 
-                       rel->exps = order_join_expressions(sql->sa, exps, rels);
+                       rel->exps = order_join_expressions(sql, exps, rels);
        } else { 
                get_relations(rel, rels);
                if (list_length(rels) > 1) {
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -471,6 +471,9 @@ rel_basetable(mvc *sql, sql_table *t, ch
                if (c->t->pkey && ((sql_kc*)c->t->pkey->k.columns->h->data)->c 
== c) {
                        p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
                        p->value = c->t->pkey;
+               } else if (c->unique == 1) {
+                       p = e->p = prop_create(sa, PROP_HASHCOL, e->p);
+                       p->value = NULL;
                }
                append(rel->exps, e);
        }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to