Changeset: 99bdad3df54a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99bdad3df54a
Modified Files:
monetdb5/modules/mal/groups.c
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_mitosis.c
monetdb5/optimizer/opt_pipes.c
Branch: default
Log Message:
moved mergetable bailout into the mitosis, ie don't split when it will
not be merged efficiently.
allow more groupdone's, ie only when a groupdone is followed
by new group instruction we stop (ie pack) at that point.
temporarly switched of groups optimizer as it seems to cause crashes,
not sure the optimizer is at fault.
diffs (173 lines):
diff --git a/monetdb5/modules/mal/groups.c b/monetdb5/modules/mal/groups.c
--- a/monetdb5/modules/mal/groups.c
+++ b/monetdb5/modules/mal/groups.c
@@ -24,10 +24,6 @@
* The groups optimizer takes a grouping sequence and attempts to minimize the
intermediate result.
* The choice depends on a good estimate of intermediate results using
properties.
*/
-typedef struct{
- int *arg;
- BAT *b;
-} Elm;
str
GRPmulticolumngroup(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
diff --git a/monetdb5/optimizer/opt_mergetable.c
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -1095,47 +1095,48 @@ OPTmergetableImplementation(Client cntxt
InstrPtr *old;
mat_t *mat;
int oldtop, fm, fn, fo, fe, i, k, m, n, o, e, mtop=0, slimit;
- int size=0, match, actions=0, distinct_topn = 0, topn_res = 0;
-
+ int size=0, match, actions=0, distinct_topn = 0, topn_res = 0,
groupdone = 0, *vars;
old = mb->stmt;
oldtop= mb->stop;
+ vars= (int*) GDKmalloc(sizeof(int)* mb->vtop);
/* check for bailout conditions */
for (i = 1; i < oldtop; i++) {
+ int j;
+
p = old[i];
- /* bail out on multiple subgroups (ie distinct) */
- if (getModuleId(p) == groupRef && getFunctionId(p) ==
subgroupdoneRef) {
- if (size > 0)
- return 0;
- size++;
+ for (j = 0; j<p->retc; j++) {
+ int res = getArg(p, j);
+ vars[res] = i;
}
- if ((getModuleId(p) == batcalcRef || getModuleId(p) == sqlRef)
&&
- (getFunctionId(p) == rankRef || getFunctionId(p) ==
rank_grpRef ||
- getFunctionId(p) == mark_grpRef || getFunctionId(p) ==
dense_rank_grpRef)) {
- /* Mergetable cannot handle order related batcalc ops */
- return 0;
+
+ /* pack if there is a group statement following a groupdone (ie
aggr(distinct)) */
+ if (getModuleId(p) == groupRef && p->argc == 5 &&
+ (getFunctionId(p) == subgroupRef || getFunctionId(p) ==
subgroupdoneRef)) {
+ InstrPtr q = old[vars[getArg(p, p->argc-1)]]; /* group
result from a previous group(done) */
+
+ if (getModuleId(q) == groupRef && getFunctionId(q) ==
subgroupdoneRef)
+ groupdone = 1;
}
- if (getModuleId(p) == aggrRef &&
- getFunctionId(p) == submedianRef)
- return 0;
if (isTopn(p))
topn_res = getArg(p, 0);
if (getModuleId(p) == algebraRef && getFunctionId(p) ==
markTRef && getArg(p, 1) == topn_res)
distinct_topn = 1;
}
+ GDKfree(vars);
/* the number of MATs is limited to the variable stack*/
mat = (mat_t*) GDKzalloc(mb->vtop * sizeof(mat_t));
- if ( mat == NULL)
+ if ( mat == NULL)
return 0;
slimit = mb->ssize;
size = (mb->stop * 1.2 < mb->ssize)? mb->ssize:(int)(mb->stop * 1.2);
mb->stmt = (InstrPtr *) GDKzalloc(size * sizeof(InstrPtr));
- if ( mb->stmt == NULL){
+ if ( mb->stmt == NULL) {
mb->stmt = old;
return 0;
}
@@ -1222,14 +1223,14 @@ OPTmergetableImplementation(Client cntxt
}
/* Now we handle subgroup and aggregation statements. */
- if (match == 1 && bats == 1 && p->argc == 4 && getModuleId(p)
== groupRef &&
+ if (!groupdone && match == 1 && bats == 1 && p->argc == 4 &&
getModuleId(p) == groupRef &&
(getFunctionId(p) == subgroupRef || getFunctionId(p) ==
subgroupdoneRef) &&
((m=is_a_mat(getArg(p,p->retc), mat, mtop)) >= 0)) {
mtop = mat_group_new(mb, p, mat, mtop, m);
actions++;
continue;
}
- if (match == 2 && bats == 2 && p->argc == 5 && getModuleId(p)
== groupRef &&
+ if (!groupdone && match == 2 && bats == 2 && p->argc == 5 &&
getModuleId(p) == groupRef &&
(getFunctionId(p) == subgroupRef || getFunctionId(p) ==
subgroupdoneRef) &&
((m=is_a_mat(getArg(p,p->retc), mat, mtop)) >= 0) &&
((n=is_a_mat(getArg(p,p->retc+1), mat, mtop)) >= 0) &&
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -54,25 +54,41 @@ OPTmitosisImplementation(Client cntxt, M
if (!eligible(mb))
return 0;
- /* locate the largest non-partitioned table */
+ old = mb->stmt;
for (i = 1; i < mb->stop; i++) {
- q = getInstrPtr(mb, i);
- if (getModuleId(q) != sqlRef || getFunctionId(q) != bindRef)
+ InstrPtr p = old[i];
+
+ /* mitosis/mergetable bailout conditions */
+
+ /* Mergetable cannot handle order related batcalc ops */
+ if ((getModuleId(p) == batcalcRef || getModuleId(p) == sqlRef)
&&
+ (getFunctionId(p) == rankRef || getFunctionId(p) ==
rank_grpRef ||
+ getFunctionId(p) == mark_grpRef || getFunctionId(p) ==
dense_rank_grpRef))
+ return 0;
+
+ if (getModuleId(p) == aggrRef && getFunctionId(p) ==
submedianRef)
+ return 0;
+ /* Mergetable cannot handle intersect/except's for now */
+ if (getModuleId(p) == algebraRef && getFunctionId(p) ==
groupbyRef)
+ return 0;
+
+ /* locate the largest non-partitioned table */
+ if (getModuleId(p) != sqlRef || getFunctionId(p) != bindRef)
continue;
/* don't split insert BATs */
- if (getVarConstant(mb, getArg(q, 5)).val.ival == 1)
+ if (getVarConstant(mb, getArg(p, 5)).val.ival == 1)
continue;
- if (q->argc > 6)
+ if (p->argc > 6)
continue; /* already partitioned */
/*
* The SQL optimizer already collects the counts of the base
* table and passes them on as a row property. All pieces for a
* single subplan should ideally fit together.
*/
- r = getVarRows(mb, getArg(q, 0));
+ r = getVarRows(mb, getArg(p, 0));
if (r >= rowcnt) {
rowcnt = r;
- target = q;
+ target = p;
estimate++;
r = 0;
}
@@ -128,7 +144,7 @@ OPTmitosisImplementation(Client cntxt, M
getVarConstant(mb, getArg(target, 3)).val.sval,
rowcnt, r, threads, pieces);
- old = mb->stmt;
+
limit = mb->stop;
if (newMalBlkStmt(mb, mb->ssize + 2 * estimate) < 0)
return 0;
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -74,7 +74,7 @@ struct PIPELINES {
"optimizer.mergetable();"
"optimizer.deadcode();"
"optimizer.commonTerms();"
- "optimizer.groups();"
+ //"optimizer.groups();"
"optimizer.joinPath();"
"optimizer.reorder();"
"optimizer.deadcode();"
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list