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