Changeset: 10bb00c27eb2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/10bb00c27eb2
Modified Files:
sql/common/sql_list.c
sql/server/rel_optimize_proj.c
sql/server/rel_optimize_sel.c
sql/server/rel_optimizer.c
sql/server/rel_optimizer_private.h
sql/server/rel_rel.c
Branch: resource_management
Log Message:
small optimizations, ie don't call pkey related optimizer if there are no pkeys.
removed useless expensive calls of rel_projections.
delay locations to when they are really needed.
diffs (115 lines):
diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -98,9 +98,7 @@ list_new_(list *l)
int
list_empty(list *l)
{
- if (l)
- return list_length(l) == 0;
- return 1;
+ return (!l || l->h == NULL);
}
static void
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
@@ -590,9 +590,6 @@ rel_push_project_up_(visitor *v, sql_rel
t = (l->op == op_project && l->l)?l->l:l;
l_exps = rel_projections(v->sql, t, NULL, 1, 1);
/* conflict with old right expressions */
- r_exps = rel_projections(v->sql, r, NULL, 1, 1);
- if (rel->attr)
- append(r_exps, exp_ref(v->sql,
rel->attr->h->data));
t = (r->op == op_project && r->l)?r->l:r;
r_exps = rel_projections(v->sql, t, NULL, 1, 1);
/* conflict with new right expressions */
@@ -2318,12 +2315,12 @@ static inline sql_rel *
rel_reduce_groupby_exps(visitor *v, sql_rel *rel)
{
list *gbe = rel->r;
-
- if (is_groupby(rel->op) && rel->r && !rel_is_ref(rel) &&
list_length(gbe)) {
+ global_props *gp = v->data;
+
+ if (gp->has_pkey && is_groupby(rel->op) && rel->r && !rel_is_ref(rel)
&& list_length(gbe)) {
sa_open(v->sql->ta);
node *n, *m;
int k, j, i, ngbe = list_length(gbe);
- int8_t *scores = SA_NEW_ARRAY(v->sql->ta, int8_t, ngbe);
sql_column *c;
sql_table **tbls = SA_NEW_ARRAY(v->sql->ta, sql_table*, ngbe);
sql_rel **bts = SA_NEW_ARRAY(v->sql->ta, sql_rel*, ngbe), *bt =
NULL;
@@ -2348,6 +2345,7 @@ rel_reduce_groupby_exps(visitor *v, sql_
* the other columns using a foreign-key join (n->1),
ie 1
* on the to be removed side.
*/
+ int8_t *scores = SA_NEW_ARRAY(v->sql->ta, int8_t, ngbe);
for(j = 0; j < i; j++) {
int l, nr = 0, cnr = 0;
@@ -3171,7 +3169,7 @@ rel_optimize_projections_(visitor *v, sq
static sql_rel *
rel_optimize_projections(visitor *v, global_props *gp, sql_rel *rel)
{
- (void) gp;
+ v->data = gp;
return rel_visitor_topdown(v, rel, &rel_optimize_projections_);
}
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -3224,8 +3224,7 @@ bind_optimize_semi_and_anti(visitor *v,
{
/* Important -> Re-write semijoins after rel_join_order */
int flag = v->sql->sql_optimizer;
- return gp->opt_level == 1 && (gp->cnt[op_join] || gp->cnt[op_left] ||
gp->cnt[op_right]
- || gp->cnt[op_full] || gp->cnt[op_semi] || gp->cnt[op_anti])
&& (flag & optimize_semi_and_anti) ? rel_optimize_semi_and_anti : NULL;
+ return gp->opt_level == 1 && (gp->cnt[op_semi] || gp->cnt[op_anti]) &&
(flag & optimize_semi_and_anti) ? rel_optimize_semi_and_anti : NULL;
}
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
@@ -38,6 +38,7 @@ rel_properties(visitor *v, sql_rel *rel)
/* If the plan has a merge table or a child of one, then
rel_merge_table_rewrite has to run */
gp->needs_mergetable_rewrite |= (isMergeTable(t) || (t->s &&
t->s->parts && (pt = partition_find_part(sql->session->tr, t, NULL))));
gp->needs_remote_replica_rewrite |= (isRemote(t) ||
isReplicaTable(t));
+ gp->has_pkey |= (t->pkey != NULL);
}
return rel;
}
diff --git a/sql/server/rel_optimizer_private.h
b/sql/server/rel_optimizer_private.h
--- a/sql/server/rel_optimizer_private.h
+++ b/sql/server/rel_optimizer_private.h
@@ -25,7 +25,8 @@ typedef struct global_props {
needs_distinct:1,
has_special_modify:1, /* Don't prune updates as pruning will
possibly result in removing the joins which therefore cannot be used for
constraint checking */
opt_level:1, /* 0 run necessary rewriters, 1 run all optimizers
*/
- recursive:1;
+ recursive:1,
+ has_pkey:1; /* any table has a pkey */
uint8_t opt_cycle; /* the optimization cycle number */
} global_props;
diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -42,12 +42,12 @@ project_unsafe(sql_rel *rel, bool allow_
if (!sub || sub->op == op_ddl)
return 1;
for(node *n = rel->exps->h; n; n = n->next) {
- sql_exp *e = n->data, *ne;
+ sql_exp *e = n->data;//, *ne;
/* aggr func in project ! */
if (exp_unsafe(e, allow_identity, false))
return 1;
- if ((ne = rel_find_exp(rel, e)) && ne != e)
+ if (is_selfref(e))
return 1; /* no self referencing */
}
return 0;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]