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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list