Changeset: 322c4978213d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=322c4978213d
Modified Files:
sql/server/rel_optimizer.c
Branch: Feb2013
Log Message:
fixed preformance regression of q21
diffs (52 lines):
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -5263,11 +5263,8 @@ is_identity_of(sql_exp *e, sql_rel *l)
return 1;
}
-/* rewrite {semi,anti}join (A, join(A,B)) into {semi,anti}join (A,B) */
-/* TODO: handle A, join(B,A) as well */
/* More general case is (join reduction)
- *
{semi,anti}join (A, join(A,B) [A.c1 == B.c1]) [ A.c1 == B.c1 ]
into {semi,anti}join (A,B) [ A.c1 == B.c1 ]
*/
@@ -5280,21 +5277,26 @@ rel_rewrite_semijoin(int *changes, mvc *
sql_rel *l = rel->l;
sql_rel *r = rel->r;
sql_rel *rl = (r->l)?r->l:NULL;
-
- if (l->ref.refcnt == 2 &&
- ((is_join(r->op) && l == r->l) ||
- (is_project(r->op) && rl && is_join(rl->op) && l ==
rl->l))){
+ int on_identity = 1;
+
+ if (!rel->exps || list_length(rel->exps) != 1 ||
!is_identity_of(rel->exps->h->data, l))
+ on_identity = 0;
+
+ /* rewrite {semi,anti}join (A, join(A,B)) into {semi,anti}join
(A,B)
+ * and {semi,anti}join (A, join(B,A)) into {semi,anti}join
(A,B)
+ * Where the semi/anti join is done using the identity */
+ if (on_identity && l->ref.refcnt == 2 && ((is_join(r->op) && (l
== r->l || l == r->r)) ||
+ (is_project(r->op) && rl && is_join(rl->op) && (l == rl->l
|| l == rl->r)))){
sql_rel *or = r;
- if (!rel->exps || list_length(rel->exps) != 1 ||
- !is_identity_of(rel->exps->h->data, l))
- return rel;
-
if (is_project(r->op))
r = rl;
- rel->r = rel_dup(r->r);
- /* maybe rename exps ? */
+ if (l == r->r)
+ rel->r = rel_dup(r->l);
+ else
+ rel->r = rel_dup(r->r);
+
rel->exps = r->exps;
r->exps = NULL;
rel_destroy(or);
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list