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]

Reply via email to