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