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]

Reply via email to