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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list