Changeset: a6223d0a02e4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a6223d0a02e4
Modified Files:
        monetdb5/modules/mal/pp_sort.c
        sql/server/rel_optimize_proj.c
Branch: default
Log Message:

performance improvement, use direct array access for sort.merge.


diffs (257 lines):

diff --git a/monetdb5/modules/mal/pp_sort.c b/monetdb5/modules/mal/pp_sort.c
--- a/monetdb5/modules/mal/pp_sort.c
+++ b/monetdb5/modules/mal/pp_sort.c
@@ -44,9 +44,10 @@ PPsubmerge_any( bat *Rzzl, bat *Rzzb, ba
        /* sofar the ANY type case, later add optimized versions */
        /* need new output bats */
        BUN rp = 0, lp = 0, o = 0, p = lp, cur = rp, sz = BATcount(zzl), e = 0;
-       rzzl = COLnew(0, TYPE_int, 1024, TRANSIENT);
-       rzzb = COLnew(0, TYPE_int, 1024, TRANSIENT);
-       rzza = COLnew(0, TYPE_int, 1024, TRANSIENT);
+       BUN outcnt = MAX(BATcount(lcol), BATcount(rcol));
+       rzzl = COLnew(0, TYPE_int, outcnt, TRANSIENT);
+       rzzb = COLnew(0, TYPE_int, outcnt, TRANSIENT);
+       rzza = COLnew(0, TYPE_int, outcnt, TRANSIENT);
 
        if (!rzzl || !rzzb || !rzza) {
                err = createException(MAL, "sort.merge", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -76,6 +77,10 @@ PPsubmerge_any( bat *Rzzl, bat *Rzzb, ba
        int pa = 0;
        lng ilen = 0, rlen = 0, tsz = BATcount(lcol) + BATcount(rcol);
        (void)tsz;
+       int *rzzlp = Tloc(rzzl, 0);
+       int *rzzbp = Tloc(rzzb, 0);
+       int *rzzap = Tloc(rzza, 0);
+       BUN cnt = 0;
        for(BUN i = 0; i<sz; i++) {
                int len = gp[i], ob = bp[i], oa = ap[i];
                bool oside = side;
@@ -132,12 +137,21 @@ PPsubmerge_any( bat *Rzzl, bat *Rzzb, ba
                                        int v1 = (int)l, v2 = (int)-b, v3 = 
(int)-a;
                                        rlen += v1;
                                        //printf("v1 -3  %d\n", v1);
-                                       if (BUNappend(rzzl, &v1, TRUE) != 
GDK_SUCCEED ||
-                                                       BUNappend(rzzb, &v2, 
TRUE) != GDK_SUCCEED ||
-                                                       BUNappend(rzza, &v3, 
TRUE) != GDK_SUCCEED) {
-                                               err = createException(MAL, 
"sort.merge", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                                               goto error_iter;
+                                       if (cnt == BATcapacity(rzzl)) {
+                                               if (BATextend(rzzl, 
BATgrows(rzzl)) != GDK_SUCCEED ||
+                                                       BATextend(rzzb, 
BATgrows(rzzb)) != GDK_SUCCEED ||
+                                                       BATextend(rzza, 
BATgrows(rzza)) != GDK_SUCCEED) {
+                                                       err = 
createException(MAL, "sort.merge", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                                       goto error_iter;
+                                               }
+                                               rzzlp = Tloc(rzzl, 0);
+                                               rzzbp = Tloc(rzzb, 0);
+                                               rzzap = Tloc(rzza, 0);
                                        }
+                                       rzzlp[cnt] = v1;
+                                       rzzbp[cnt] = v2;
+                                       rzzap[cnt] = v3;
+                                       cnt++;
                                        b = 0;
                                        a = 0;
                                }
@@ -162,26 +176,33 @@ PPsubmerge_any( bat *Rzzl, bat *Rzzb, ba
                                                break;
                                }
                        }
+                       if ((cnt+2) >= BATcapacity(rzzl)) {
+                               if (BATextend(rzzl, BATgrows(rzzl)) != 
GDK_SUCCEED ||
+                                       BATextend(rzzb, BATgrows(rzzb)) != 
GDK_SUCCEED ||
+                                       BATextend(rzza, BATgrows(rzza)) != 
GDK_SUCCEED) {
+                                       err = createException(MAL, 
"sort.merge", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       goto error_iter;
+                               }
+                               rzzlp = Tloc(rzzl, 0);
+                               rzzbp = Tloc(rzzb, 0);
+                               rzzap = Tloc(rzza, 0);
+                       }
                        int v1 = (int)l, v2 = (int)-b, v3 = (int)-a;
                        rlen += v1;
                        //printf("v1 -2  %d\n", v1);
-                       if (BUNappend(rzzl, &v1, TRUE) != GDK_SUCCEED ||
-                                       BUNappend(rzzb, &v2, TRUE) != 
GDK_SUCCEED ||
-                                       BUNappend(rzza, &v3, TRUE) != 
GDK_SUCCEED) {
-                               err = createException(MAL, "sort.merge", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                               goto error_iter;
-                       }
+                       rzzlp[cnt] = v1;
+                       rzzbp[cnt] = v2;
+                       rzzap[cnt] = v3;
+                       cnt++;
                        if (oside == side && p < e) {
                                BUN l = e - p;
                                int v1 = (int)l, v2 = (int)0, v3 = (int)0;
                                rlen += v1;
                                //printf("v1 -1  %d\n", v1);
-                               if (BUNappend(rzzl, &v1, TRUE) != GDK_SUCCEED ||
-                                       BUNappend(rzzb, &v2, TRUE) != 
GDK_SUCCEED ||
-                                       BUNappend(rzza, &v3, TRUE) != 
GDK_SUCCEED) {
-                                       err = createException(MAL, 
"sort.merge", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                                       goto error_iter;
-                               }
+                               rzzlp[cnt] = v1;
+                               rzzbp[cnt] = v2;
+                               rzzap[cnt] = v3;
+                               cnt++;
                                p = e;
                                if (side) {
                                        rp = p;
@@ -199,12 +220,21 @@ PPsubmerge_any( bat *Rzzl, bat *Rzzb, ba
                } else {
                        rlen += len;
                        //printf("len %d\n", len);
-                       if (BUNappend(rzzl, &len, TRUE) != GDK_SUCCEED ||
-                           BUNappend(rzzb, &ob, TRUE) != GDK_SUCCEED ||
-                           BUNappend(rzza, &oa, TRUE) != GDK_SUCCEED) {
-                               err = createException(MAL, "sort.merge", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                               goto error_iter;
+                       if (cnt == BATcapacity(rzzl)) {
+                               if (BATextend(rzzl, BATgrows(rzzl)) != 
GDK_SUCCEED ||
+                                       BATextend(rzzb, BATgrows(rzzb)) != 
GDK_SUCCEED ||
+                                       BATextend(rzza, BATgrows(rzza)) != 
GDK_SUCCEED) {
+                                       err = createException(MAL, 
"sort.merge", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       goto error_iter;
+                               }
+                               rzzlp = Tloc(rzzl, 0);
+                               rzzbp = Tloc(rzzb, 0);
+                               rzzap = Tloc(rzza, 0);
                        }
+                       rzzlp[cnt] = len;
+                       rzzbp[cnt] = ob;
+                       rzzap[cnt] = oa;
+                       cnt++;
                        if (side) {
                                rp = p;
                        } else {
@@ -230,6 +260,13 @@ PPsubmerge_any( bat *Rzzl, bat *Rzzb, ba
        fflush(stdout);
        */
 
+       BATsetcount(rzzl, cnt);
+       BATsetcount(rzzb, cnt);
+       BATsetcount(rzza, cnt);
+       BATnegateprops(rzzl);
+       BATnegateprops(rzzb);
+       BATnegateprops(rzza);
+
        bat_iterator_end(&li);
        bat_iterator_end(&ri);
 done:
@@ -271,9 +308,10 @@ PPmerge_any( bat *Rzzl, bat *Rzzb, bat *
        /* need new output bats */
        BUN rp = 0, lp = 0, re = BATcount(rcol), le = BATcount(lcol), o = 0, p 
= lp, e = le, cur = rp;
        lng b = 0, a = 0;
-       rzzl = COLnew(0, TYPE_int, 1024, TRANSIENT);
-       rzzb = COLnew(0, TYPE_int, 1024, TRANSIENT);
-       rzza = COLnew(0, TYPE_int, 1024, TRANSIENT);
+       BUN outcnt = MAX(le, re);
+       rzzl = COLnew(0, TYPE_int, outcnt, TRANSIENT);
+       rzzb = COLnew(0, TYPE_int, outcnt, TRANSIENT);
+       rzza = COLnew(0, TYPE_int, outcnt, TRANSIENT);
 
        if (!rzzl || !rzzb || !rzza) {
                err = createException(MAL, "sort.merge", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
@@ -300,6 +338,10 @@ PPmerge_any( bat *Rzzl, bat *Rzzb, bat *
                nilsmallest = false;
 
        int side = 0;
+       int *rzzlp = Tloc(rzzl, 0);
+       int *rzzbp = Tloc(rzzb, 0);
+       int *rzzap = Tloc(rzza, 0);
+       BUN cnt = 0;
        for(; p<e; ) {
                const void *vc = !side?BUNtail(&ri, cur):BUNtail(&li, cur);
                const void *vp =  side?BUNtail(&ri, p):BUNtail(&li, p);
@@ -334,12 +376,21 @@ PPmerge_any( bat *Rzzl, bat *Rzzb, bat *
                        /* zzl stores len of run from one of the sides, side 
flips starting at left */
                        /* b store number of equal values at end of run */
                        /* a store number of equal values at start of next run 
*/
-                       if (BUNappend(rzzl, &v1, TRUE) != GDK_SUCCEED ||
-                               BUNappend(rzzb, &v2, TRUE) != GDK_SUCCEED ||
-                               BUNappend(rzza, &v3, TRUE) != GDK_SUCCEED) {
-                               err = createException(MAL, "sort.merge", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                               goto error_iter;
+                       if (cnt == BATcapacity(rzzl)) {
+                               if (BATextend(rzzl, BATgrows(rzzl)) != 
GDK_SUCCEED ||
+                                       BATextend(rzzb, BATgrows(rzzb)) != 
GDK_SUCCEED ||
+                                       BATextend(rzza, BATgrows(rzza)) != 
GDK_SUCCEED) {
+                                       err = createException(MAL, 
"sort.merge", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       goto error_iter;
+                               }
+                               rzzlp = Tloc(rzzl, 0);
+                               rzzbp = Tloc(rzzb, 0);
+                               rzzap = Tloc(rzza, 0);
                        }
+                       rzzlp[cnt] = v1;
+                       rzzbp[cnt] = v2;
+                       rzzap[cnt] = v3;
+                       cnt++;
                        b = 0;
                        a = 0;
                }
@@ -364,26 +415,39 @@ PPmerge_any( bat *Rzzl, bat *Rzzb, bat *
                                break;
                }
        }
+       if ((cnt+2) >= BATcapacity(rzzl)) {
+               if (BATextend(rzzl, BATgrows(rzzl)) != GDK_SUCCEED ||
+                       BATextend(rzzb, BATgrows(rzzb)) != GDK_SUCCEED ||
+                       BATextend(rzza, BATgrows(rzza)) != GDK_SUCCEED) {
+                       err = createException(MAL, "sort.merge", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                       goto error_iter;
+               }
+               rzzlp = Tloc(rzzl, 0);
+               rzzbp = Tloc(rzzb, 0);
+               rzzap = Tloc(rzza, 0);
+       }
        int v1 = (int)l, v2 = (int)-b, v3 = (int)-a;
        assert( (!v2 && !v3) || (v2 && v3));
-       if (BUNappend(rzzl, &v1, TRUE) != GDK_SUCCEED ||
-               BUNappend(rzzb, &v2, TRUE) != GDK_SUCCEED ||
-               BUNappend(rzza, &v3, TRUE) != GDK_SUCCEED) {
-               err = createException(MAL, "sort.merge", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
-               goto error_iter;
-       }
+       rzzlp[cnt] = v1;
+       rzzbp[cnt] = v2;
+       rzzap[cnt] = v3;
+       cnt++;
        b = 0;
        a = 0;
        if (p < e) {
                BUN l = e - p;
                int v1 = (int)l, v2 = (int)0, v3 = (int)0;
-               if (BUNappend(rzzl, &v1, TRUE) != GDK_SUCCEED ||
-                       BUNappend(rzzb, &v2, TRUE) != GDK_SUCCEED ||
-                       BUNappend(rzza, &v3, TRUE) != GDK_SUCCEED) {
-                       err = createException(MAL, "sort.merge", 
SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                       goto error_iter;
-               }
+               rzzlp[cnt] = v1;
+               rzzbp[cnt] = v2;
+               rzzap[cnt] = v3;
+               cnt++;
        }
+       BATsetcount(rzzl, cnt);
+       BATsetcount(rzzb, cnt);
+       BATsetcount(rzza, cnt);
+       BATnegateprops(rzzl);
+       BATnegateprops(rzzb);
+       BATnegateprops(rzza);
        bat_iterator_end(&li);
        bat_iterator_end(&ri);
 done:
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -2328,6 +2328,7 @@ rel_reduce_groupby_exps(visitor *v, sql_
        list *gbe = rel->r;
        global_props *gp = v->data;
 
+       /* ukey + no null could also work and a single unique (base) column 
also reduces the group by exps */
        if (gp->has_pkey && is_groupby(rel->op) && rel->r && !rel_is_ref(rel) 
&& list_length(gbe)) {
                allocator *ta = MT_thread_getallocator();
                allocator_state ta_state = ma_open(ta);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to