Changeset: 44609c057407 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=44609c057407
Modified Files:
sql/server/rel_optimizer.c
sql/server/rel_prop.c
sql/storage/bat/bat_storage.c
Branch: jun-order
Log Message:
small test of reordering joins based partialy on table size (WIP)
diffs (148 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
@@ -269,6 +269,8 @@ psm_exps_properties(mvc *sql, global_pro
psm_exp_properties(sql, gp, n->data);
}
+static int exps_count(list *exps);
+
static void
rel_properties(mvc *sql, global_props *gp, sql_rel *rel)
{
@@ -330,8 +332,16 @@ rel_properties(mvc *sql, global_props *g
switch (rel->op) {
case op_basetable:
case op_table:
- if (!find_prop(rel->p, PROP_COUNT))
- rel->p = prop_create(sql->sa, PROP_COUNT, rel->p);
+ if (!find_prop(rel->p, PROP_COUNT)) {
+ prop *p = rel->p = prop_create(sql->sa, PROP_COUNT,
rel->p);
+
+ if (mvc_debug_on(sql, 4096) && p &&
is_basetable(rel->op)) {
+ sql_table *t = rel->l;
+
+ if (t && isTable(t))
+ p->value =
(void*)store_funcs.count_col(sql->session->tr, t->columns.set->h->data, 1);
+ }
+ }
break;
case op_join:
case op_left:
@@ -351,6 +361,21 @@ rel_properties(mvc *sql, global_props *g
case op_topn:
case op_sample:
case op_select:
+ if (mvc_debug_on(sql, 4096) && is_select(rel->op) &&
!find_prop(rel->p, PROP_COUNT)) {
+ sql_rel *l = rel->l;
+ if (l && !list_empty(rel->exps)) {
+ prop *p = find_prop(l->p, PROP_COUNT);
+ if (p && p->value) {
+ lng cnt = (lng)p->value;
+ prop *np = rel->p =
prop_create(sql->sa, PROP_COUNT, rel->p);
+
+ if (np) {
+ lng ec = exps_count(rel->exps);
+ np->value =
(void*)((cnt+ec-1)/ec);
+ }
+ }
+ }
+ }
break;
case op_insert:
@@ -641,6 +666,35 @@ exps_count(list *exps)
return cnt;
}
+static prop*
+rel_getprop(sql_rel *r)
+{
+ if (!r)
+ return NULL;
+ if(is_basetable(r->op))
+ return find_prop(r->p, PROP_COUNT);
+ if (is_select(r->op))
+ return rel_getprop(r->l);
+ return NULL;
+}
+
+static lng
+add_count_weight(sql_rel *r, lng curweight)
+{
+ if (!r)
+ return 0;
+ prop *p = rel_getprop(r);
+ if (p && p->value) {
+ lng cnt = (lng)p->value;
+ if (cnt > 100000)
+ return curweight/100;
+ if (cnt < 100)
+ return curweight*100;
+ return curweight;
+ }
+ return 0;
+}
+
static list *
order_join_expressions(mvc *sql, list *dje, list *rels)
{
@@ -648,7 +702,8 @@ order_join_expressions(mvc *sql, list *d
node *n = NULL;
int i, *keys, cnt = list_length(dje);
void **data;
- int debug = mvc_debug_on(sql, 16);
+ int use_select_exps = mvc_debug_on(sql, 16);
+ int use_table_size = mvc_debug_on(sql, 4096);
if (cnt == 0)
return res;
@@ -671,9 +726,13 @@ order_join_expressions(mvc *sql, list *d
sql_rel *r = find_rel(rels, e->r);
if (l && is_select(l->op) && l->exps)
- keys[i] += list_length(l->exps)*10 +
exps_count(l->exps)*debug;
+ keys[i] += list_length(l->exps)*10 +
exps_count(l->exps)*use_select_exps;
if (r && is_select(r->op) && r->exps)
- keys[i] += list_length(r->exps)*10 +
exps_count(r->exps)*debug;
+ keys[i] += list_length(r->exps)*10 +
exps_count(r->exps)*use_select_exps;
+ if (use_table_size) {
+ keys[i] = add_count_weight(l, keys[i]);
+ keys[i] = add_count_weight(r, keys[i]);
+ }
}
data[i] = n->data;
}
diff --git a/sql/server/rel_prop.c b/sql/server/rel_prop.c
--- a/sql/server/rel_prop.c
+++ b/sql/server/rel_prop.c
@@ -98,6 +98,14 @@ propvalue2string( prop *p)
return _STRDUP(uri);
}
+ case PROP_COUNT: {
+ if (p->value) {
+ char buf[16];
+ lng cnt = (lng)p->value;
+ snprintf(buf, 16, LLFMT, cnt);
+ return _STRDUP(buf);
+ }
+ }
default:
break;
}
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -1079,7 +1079,10 @@ count_col(sql_trans *tr, sql_column *c,
return 0;
if (!c->data) {
sql_column *oc = tr_find_column(tr->parent, c);
- c->data = timestamp_delta(oc->data, c->base.stime);
+ if (oc)
+ c->data = timestamp_delta(oc->data, c->base.stime);
+ else
+ return 0;
}
b = c->data;
if (!b)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list