Changeset: 6767e865d917 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6767e865d917
Modified Files:
        monetdb5/optimizer/opt_prelude.mx
        monetdb5/optimizer/opt_support.mx
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_gencode.mx
        sql/server/rel_optimizer.c
Branch: default
Log Message:

fixed performance degradation for tpch 20.
(failed to push join/semijoin through group by)


diffs (175 lines):

diff --git a/monetdb5/optimizer/opt_prelude.mx 
b/monetdb5/optimizer/opt_prelude.mx
--- a/monetdb5/optimizer/opt_prelude.mx
+++ b/monetdb5/optimizer/opt_prelude.mx
@@ -203,6 +203,7 @@
 opt_export  str userRef;
 opt_export  str antiuselectRef;
 opt_export  str antijoinRef;
+opt_export  str zero_or_oneRef;
 
 opt_export int canBeCrackedProp;       /* binary */
 opt_export int canBeJoinselectProp;    /* binary */
@@ -414,6 +415,7 @@
 str userRef;
 str antiuselectRef;
 str antijoinRef;
+str zero_or_oneRef;
 
 int canBeCrackedProp;
 int canBeJoinselectProp;
@@ -620,6 +622,7 @@
                uselectRef = putName("uselect",7);
                antiuselectRef = putName("antiuselect",11);
                antijoinRef = putName("antijoin",8);
+               zero_or_oneRef = putName("zero_or_one",11);
                userRef = putName("user",4);
 
                canBeCrackedProp = PropertyIndex("canBeCracked");
diff --git a/monetdb5/optimizer/opt_support.mx 
b/monetdb5/optimizer/opt_support.mx
--- a/monetdb5/optimizer/opt_support.mx
+++ b/monetdb5/optimizer/opt_support.mx
@@ -1323,6 +1323,7 @@
                if (getFunctionId(p) == copy_fromRef) return FALSE;
                /* assertions are the end-point of a flow path */
                if (getFunctionId(p) == not_uniqueRef) return FALSE;
+               if (getFunctionId(p) == zero_or_oneRef) return FALSE;
                if (isUpdateInstruction(p)) return FALSE;
                return TRUE;
        }
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -291,7 +291,7 @@
 address mvc_export_operation_wrap
 comment "Export result of schema/transaction queries"; 
 
-pattern affectedRows{unsafe}(nr:wrd, w:str) :void
+pattern affectedRows{unsafe}(mvc:ptr, nr:wrd, w:str) :ptr
 address mvc_affected_rows_wrap
 comment "export the number of affected rows by the current query";
 
@@ -1573,8 +1573,9 @@
                throw(SQL, "mvc","No client record");
        if (cntxt->state[MAL_SCENARIO_PARSER] == NULL || 
cntxt->state[MAL_SCENARIO_OPTIMIZE] == NULL)
                throw(SQL, "mvc","SQL module not initialized");
-       *c = ((mvc *) cntxt ->state[MAL_SCENARIO_OPTIMIZE]); 
-       if (*c == 0)
+       if (c)
+               *c = ((mvc *) cntxt ->state[MAL_SCENARIO_OPTIMIZE]); 
+       if (c && *c == 0)
                throw(SQL, "mvc","SQL module not initialized, mvc struct 
missing");
        if (b)
                *b = ((backend*) cntxt->state[MAL_SCENARIO_PARSER]);
@@ -3249,30 +3250,28 @@
        return MAL_SUCCEED;
 }
 
-/* str mvc_affected_rows_wrap(int *r, wrd *nr, str *w); */
+/* str mvc_affected_rows_wrap(ptr *m, ptr m, wrd *nr, str *w); */
 str
 mvc_affected_rows_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
        backend *b = NULL;
-       mvc *c = NULL;
-       str msg = getContext(cntxt,mb, &c, &b);
-       int *r  = (int *) getArgReference(stk, pci, 0);
+       str msg = getContext(cntxt, mb, NULL, &b);
+       ptr *res = (ptr*)getArgReference(stk, pci, 0);
+       mvc *m = *(mvc**)getArgReference(stk, pci, 1);
 #ifndef NDEBUG
-       int mtype = getArgType(mb, pci, 1);
+       int mtype = getArgType(mb, pci, 2);
 #endif
        wrd nr;
-       str *w = (str *) getArgReference(stk, pci, 2);
-
-       (void) cntxt;
+       str *w = (str *) getArgReference(stk, pci, 3);
+
        if (msg)
                return msg;
+       *res = (ptr)m;
        assert (mtype == TYPE_wrd);
-       nr = *(wrd *) getArgReference(stk, pci, 1);
-       if (mvc_export_affrows(c, b->out, nr, *w)) {
+       nr = *(wrd *) getArgReference(stk, pci, 2);
+       if (mvc_export_affrows(m, b->out, nr, *w)) 
                throw(SQL, "sql.affectedRows", "failed");
-       }
-       (void)r;
-       return NULL;
+       return MAL_SUCCEED;
 }
 
 /* str mvc_export_head_wrap(int *ret, stream **s, int *res_id); */
diff --git a/sql/backends/monet5/sql_gencode.mx 
b/sql/backends/monet5/sql_gencode.mx
--- a/sql/backends/monet5/sql_gencode.mx
+++ b/sql/backends/monet5/sql_gencode.mx
@@ -1751,6 +1751,8 @@
                        int o1 = _dumpstmt(sql, mb, s->op1);
 
                        q = newStmt1(mb, sqlRef, "affectedRows");
+                       q = pushArgument(mb, q, sql->mvc_var); 
+                       getArg(q, 0) = sql->mvc_var= 
newTmpVariable(mb,TYPE_ptr);
                        q = pushArgument(mb, q, o1);
                        q = pushStr(mb, q, ""); /* warning */
                        s->nr = getDestVar(q);
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
@@ -1022,7 +1022,7 @@
        node *n;
        list *nl = new_exp_list(sql->sa);
 
-       for(n = exps->h; n; n=n->next) {
+       for(n = exps->h; n; n = n->next) {
                sql_exp *arg = n->data;
 
                arg = _exp_push_down(sql, arg, f, t);
@@ -1041,6 +1041,11 @@
 
        switch(e->type) {
        case e_column:
+               if (is_union(f->op)) {
+                       int p = list_position(f->exps, rel_find_exp(f, e));
+
+                       return list_fetch(t->exps, p);
+               }
                if (e->l) { 
                        ne = rel_bind_column2(sql, f, e->l, e->r, 0);
                        /* if relation name matches expressions relation name, 
find column based on column name alone */
@@ -1052,6 +1057,8 @@
                e = NULL;
                if (ne->name && ne->rname)
                        e = rel_bind_column2(sql, t, ne->rname, ne->name, 0);
+               if (!e && ne->name && !ne->rname)
+                       e = rel_bind_column(sql, t, ne->name, 0);
                if (!e && ne->name && ne->r && ne->l) 
                        e = rel_bind_column2(sql, t, ne->l, ne->r, 0);
                if (!e && ne->r && !ne->l)
@@ -1905,12 +1912,12 @@
  *     groupby ( [ union all( groupby( a, [gbe], [ count, sum] ), [ groupby( 
b, [gbe], [ count, sum] )) , [gbe], [sum, sum] ) 
  */
 static sql_rel *
-rel_push_aggr(int *changes, mvc *sql, sql_rel *rel) 
+rel_push_aggr_down(int *changes, mvc *sql, sql_rel *rel) 
 {
        sql_rel *u = rel->l;
 
        /* TODO disjoint partitions don't need the last group by */
-       if (rel->op == op_groupby && /*(!rel->r || list_length(rel->r) == 0) 
&&*/
+       if (rel->op == op_groupby && 
            u && is_union(u->op) && !need_distinct(u) && u->exps) {
                sql_rel *g = rel;
                sql_rel *l = u->l;
@@ -3948,8 +3955,8 @@
        }
 
        if (gp.cnt[op_groupby]) {
-               rel = rewrite(sql, rel, &rel_avg2sum_count, &changes); 
-               rel = rewrite(sql, rel, &rel_push_aggr, &changes);
+               rel = rewrite_topdown(sql, rel, &rel_avg2sum_count, &changes); 
+               rel = rewrite_topdown(sql, rel, &rel_push_aggr_down, &changes);
                rel = rewrite(sql, rel, &rel_groupby_order, &changes); 
                rel = rewrite(sql, rel, &rel_reduce_groupby_exps, &changes); 
        }
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to