Changeset: 1cef3af3bd26 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1cef3af3bd26
Modified Files:
        sql/backends/monet5/rel_bin.c
Branch: Nov2019
Log Message:

Get preference for equi-joins/filters first on rel2bin_semijoin. This speeds up 
tpc-h q17


diffs (68 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1953,7 +1953,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
                        stmt *s = NULL;
                        prop *p;
 
-                       /* only handle simple joins here */             
+                       /* only handle simple joins here */
                        if ((exp_has_func(e) && get_cmp(e) != cmp_filter) ||
                            get_cmp(e) == cmp_or || e->f) {
                                if (!join && !list_length(lje)) {
@@ -2154,7 +2154,6 @@ rel2bin_antijoin(backend *be, sql_rel *r
        right = row2cols(be, right);
 
        if (rel->exps) {
-
                jexps = sa_list(sql->sa);
                mexps = sa_list(sql->sa);
 
@@ -2292,21 +2291,43 @@ rel2bin_semijoin(backend *be, sql_rel *r
 #endif
        if (rel->exps) {
                int idx = 0;
+               list *jexps = sa_list(sql->sa);
                list *lje = sa_list(sql->sa);
                list *rje = sa_list(sql->sa);
 
+               /* get equi-joins/filters first */
+               if (list_length(rel->exps) > 1) {
+                       for( en = rel->exps->h; en; en = en->next ) {
+                               sql_exp *e = en->data;
+                               if (e->type == e_cmp && (e->flag == cmp_equal 
|| e->flag == cmp_filter))
+                                       list_append(jexps, e);
+                       }
+                       for( en = rel->exps->h; en; en = en->next ) {
+                               sql_exp *e = en->data;
+                               if (e->type != e_cmp || (e->flag != cmp_equal 
&& e->flag != cmp_filter))
+                                       list_append(jexps, e);
+                       }
+                       rel->exps = jexps;
+               }
+
                for( en = rel->exps->h; en; en = en->next ) {
                        int join_idx = sql->opt_stats[0];
                        sql_exp *e = en->data;
                        stmt *s = NULL;
 
-                       /* only handle simple joins here */             
-                       if (idx || e->type != e_cmp || (e->flag != cmp_equal && 
e->flag != mark_in))
-                               break;
+                       /* only handle simple joins here */
                        if ((exp_has_func(e) && get_cmp(e) != cmp_filter) ||
-                           (get_cmp(e) == cmp_or)) { 
+                           get_cmp(e) == cmp_or || e->f) {
+                               if (!join && !list_length(lje)) {
+                                       stmt *l = bin_first_column(be, left);
+                                       stmt *r = bin_first_column(be, right);
+                                       join = stmt_join(be, l, r, 0, cmp_all); 
+                               }
                                break;
                        }
+                       if (list_length(lje) && (idx || e->type != e_cmp || 
(e->flag != cmp_equal && e->flag != cmp_filter) ||
+                          (join && e->flag == cmp_filter)))
+                               break;
 
                        s = exp_bin(be, en->data, left, right, NULL, NULL, 
NULL, NULL);
                        if (!s) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to