Changeset: 3a334a05a587 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3a334a05a587
Modified Files:
sql/server/rel_optimize_sel.c
sql/server/rel_statistics.c
Branch: pp_hashjoin
Log Message:
improved selectivity recomputation
cleanup
don't push projects with ordering down joins
diffs (90 lines):
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
@@ -1537,7 +1537,6 @@ static void
find_fk( mvc *sql, list *rels, list *exps)
{
node *djn;
- //list *sdje, *aje, *dje;
list *aje, *dje;
list *lrels, *rrels;
@@ -1676,8 +1675,6 @@ remove_blocking_selects( mvc *sql, sql_r
}
}
-static sql_rel *rel_join_order_(visitor *v, sql_rel *rel);
-
static void
get_relations(visitor *v, sql_rel *rel, list *rels)
{
@@ -1691,7 +1688,6 @@ get_relations(visitor *v, sql_rel *rel,
rel->r = NULL;
rel_destroy(v->sql, rel);
} else {
- rel = rel_join_order_(v, rel);
append(rels, rel);
}
}
@@ -2750,9 +2746,11 @@ exp_selectivity(visitor *v, sql_exp *e,
}
}
if (jip) {
- join_idx_estimate = lv>rv?lv:rv;
-
- dbl s = ((dbl)join_idx_estimate/(lv*rv));
+ join_idx_estimate = lv>rv ? lv : rv;
+
+ prop *rp = lv>rv ? find_prop(r->p, PROP_SELECTIVITY) :
find_prop(l->p, PROP_SELECTIVITY);
+ dbl sel = rp ? rp->value.dval : 1;
+ dbl s = ((dbl)join_idx_estimate/(lv*rv)) * sel;
if (!p)
p = prop_create(v->sql->sa, PROP_SELECTIVITY, (prop *)
e->p);
p->value.dval = s;
@@ -2822,7 +2820,8 @@ exp_cost(visitor *v, sql_exp *e, ulng ma
if (rcard == BUN_NONE)
rcard = max;
}
- cost = ( (dbl)lcard + (dbl)rcard + (lcard*rcard * sel) );
+ BUN n = l->nrcols + r->nrcols; /* not correct includes join
exps */
+ cost = ( (dbl)lcard + (dbl)rcard + (lcard*rcard * sel * n * 8)
);
if (VERBOSE) {
printf("%F %F ", cost, sel);
_exp_print(v->sql, e);
@@ -3644,6 +3643,8 @@ push_in_join_down(mvc *sql, list *rels,
return rels;
}
+static sql_rel *rel_join_order_(visitor *v, sql_rel *rel);
+
sql_rel *
reorder_join(visitor *v, sql_rel *rel)
{
@@ -5268,7 +5269,7 @@ rel_push_func_down(visitor *v, sql_rel *
if (v->changes > changes) /* once we get a better join order,
we can try to remove this projection */
return rel_project(v->sql->sa, rel,
rel_projections(v->sql, rel, NULL, 1, 1));
}
- if (is_simple_project(rel->op) && rel->l && rel->exps) {
+ if (is_simple_project(rel->op) && rel->l && rel->exps && !rel->r) {
sql_rel *pl = rel->l;
if (is_joinop(pl->op) && exps_can_push_func(rel->exps, rel)) {
diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -998,11 +998,11 @@ rel_get_statistics_(visitor *v, sql_rel
BUN uniques_estimate = BUN_MAX;
if (find_prop(e->p, PROP_JOINIDX)) {
- prop *lsp = find_prop(l->p,
PROP_SELECTIVITY), *rsp = find_prop(r->p, PROP_SELECTIVITY);
- dbl ls = lsp ? lsp->value.dval
: 1.0;
- dbl rs = rsp ? rsp->value.dval
: 1.0;
+ //prop *lsp = find_prop(l->p,
PROP_SELECTIVITY), *rsp = find_prop(r->p, PROP_SELECTIVITY);
+ //dbl ls = lsp ?
lsp->value.dval : 1.0;
+ //dbl rs = rsp ?
rsp->value.dval : 1.0;
join_idx_estimate = lv>rv?lv:rv;
- join_idx_estimate *= ls * rs;
+ //join_idx_estimate *= ls * rs;
if (join_idx_estimate < 1)
join_idx_estimate = 1;
dbl s =
((dbl)join_idx_estimate/(lv*rv));
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]