Changeset: 073d52d91db5 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=073d52d91db5 Modified Files: gdk/gdk_join.c Branch: default Log Message:
Improved new fetchjoin a little. diffs (75 lines): diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c --- a/gdk/gdk_join.c +++ b/gdk/gdk_join.c @@ -3749,24 +3749,56 @@ bandjoin(BAT *r1, BAT *r2, BAT *l, BAT * /* small ordered right, dense left, oid's only, do fetches */ static gdk_return -fetchjoin( BAT *r1, BAT *r2, BAT *l, BAT *r) +fetchjoin(BAT *r1, BAT *r2, BAT *l, BAT *r) { oid lo = l->tseqbase, hi = lo + BATcount(l); BUN b = SORTfndfirst(r, &lo), e = SORTfndlast(r, &hi), p; + ALGODEBUG fprintf(stderr, "#fetchjoin(l=%s#" BUNFMT "[%s]%s%s%s," + "r=%s#" BUNFMT "[%s]%s%s%s)\n", + BATgetId(l), BATcount(l), ATOMname(l->ttype), + l->tsorted ? "-sorted" : "", + l->trevsorted ? "-revsorted" : "", + l->tkey & 1 ? "-key" : "", + BATgetId(r), BATcount(r), ATOMname(r->ttype), + r->tsorted ? "-sorted" : "", + r->trevsorted ? "-revsorted" : "", + r->tkey & 1 ? "-key" : ""); + BATseqbase(r1, 0); if (r2) { + if (BATextend(r2, e - b) != GDK_SUCCEED) + goto bailout; BATseqbase(r2, 0); - for(p = b; p < e; p++) { + for (p = b; p < e; p++) { oid v = p + r->hseqbase; - BUNappend(r2, &v, FALSE); + APPEND(r2, v); } + BATsetcount(r2, e - b); + r2->tkey = 1; + r2->tdense = 1; + r2->tsorted = 1; + r2->trevsorted = e - b <= 1; + r2->tseqbase = e == b ? 0 : r->hseqbase + b; + virtualize(r2); } - for(p = b; p < e; p++) { - oid v = *(oid*)Tloc(r, p) - l->tseqbase + l->hseqbase; - BUNappend(r1, &v, FALSE); + if (BATextend(r1, e - b) != GDK_SUCCEED) + goto bailout; + for (p = b; p < e; p++) { + oid v = *(const oid*)Tloc(r, p) - l->tseqbase + l->hseqbase; + APPEND(r1, v); } + BATsetcount(r1, e - b); + r1->tkey = r->tkey & 1; + r1->tsorted = r->tsorted || e - b <= 1; + r1->trevsorted = r->trevsorted || e - b <= 1; + r1->tdense = e - b <= 1; + r1->tseqbase = e == b ? 0 : e - b == 1 ? *(const oid *)Tloc(r1, 0) : oid_nil; return GDK_SUCCEED; + bailout: + BBPreclaim(r1); + BBPreclaim(r2); + return GDK_FAIL; } @@ -3815,7 +3847,7 @@ subleftjoin(BAT **r1p, BAT **r2p, BAT *l BATcount(r) * (Tsize(r) + (r->T->vheap ? r->T->vheap->size : 0) + 2 * sizeof(BUN)) > GDK_mem_maxsize / (GDKnr_threads ? GDKnr_threads : 1))) return mergejoin(r1, r2, l, r, sl, sr, nil_matches, nil_on_miss, semi, only_misses, maxsize, t0, 0); - if (BATtdense(l) && BATordered(r) && (rcount * 1024) < lcount && ATOMtype(l->ttype) == TYPE_oid && !sl && !sr && !nil_matches && !only_misses) + if (BATtdense(l) && BATordered(r) && (rcount * 1024) < lcount && ATOMtype(l->ttype) == TYPE_oid && !sl && !sr && !nil_matches && !only_misses) return fetchjoin(r1, r2, l, r); return hashjoin(r1, r2, l, r, sl, sr, nil_matches, nil_on_miss, semi, only_misses, maxsize, t0, 0, "leftjoin"); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list