Changeset: afb50f02a146 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afb50f02a146
Modified Files:
sql/server/rel_optimizer.c
sql/test/BugTracker-2012/Tests/All
Branch: Oct2012
Log Message:
only use hash index when joining over 2 tables
diffs (91 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
@@ -173,6 +173,7 @@ exp_find_column_( sql_rel *rel, sql_exp
return NULL;
}
+/* find column for the select/join expression */
static sql_column *
sjexp_col(sql_exp *e, sql_rel *r)
{
@@ -728,7 +729,7 @@ order_joins(mvc *sql, list *rels, list *
/* complex expressions may touch multiple base tables
* Should be pushed up to extra selection.
* */
- if (cje->type != e_cmp || !is_complex_exp(cje->flag) /*||
+ if (cje->type != e_cmp || !is_complex_exp(cje->flag) ||
!find_prop(cje->p, PROP_HASHCOL) /*||
(cje->type == e_cmp && cje->f == NULL)*/) {
l = find_one_rel(rels, cje->l);
r = find_one_rel(rels, cje->r);
@@ -4679,6 +4680,7 @@ find_index(sql_allocator *sa, sql_rel *r
/* Depending on the index type we should (in the rel_bin) generate
more code, ie for spatial index add post filter etc, for hash
compute hash value and use index */
+
if (sub->exps && rel->exps)
for(n = sub->exps->h; n; n = n->next) {
prop *p;
@@ -4699,6 +4701,8 @@ find_index(sql_allocator *sa, sql_rel *r
/* now we obtain the columns, move into
sql_column_kc_cmp! */
cols = list_map(exps, sub, (fmap) &sjexp_col);
+ /* TODO check that at most 2 relations are involved */
+
/* Match the index columns with the expression columns.
TODO, Allow partial matches ! */
if (list_match(cols, i->columns, cmp) == 0) {
@@ -4747,20 +4751,34 @@ rel_use_index(int *changes, mvc *sql, sq
if (i) {
prop *p;
node *n;
+ int single_table = 1;
+ sql_exp *re = NULL;
- /* add PROP_HASHCOL to all column exps */
- for( n = exps->h; n; n = n->next) {
+ for( n = exps->h; n && single_table; n = n->next) {
sql_exp *e = n->data;
-
- /* swapped ? */
+ sql_exp *nre = e->r;
+
if (is_join(rel->op) &&
- ((left && !rel_find_exp(rel->l, e->l))
||
- (!left && !rel_find_exp(rel->r,
e->l))))
- n->data = e = exp_compare(sql->sa,
e->r, e->l, cmp_equal);
- p = find_prop(e->p, PROP_HASHCOL);
- if (!p)
- e->p = p = prop_create(sql->sa,
PROP_HASHCOL, e->p);
- p->value = i;
+ ((left && !rel_find_exp(rel->l, e->l))
||
+ (!left && !rel_find_exp(rel->r,
e->l))))
+ nre = e->l;
+ single_table = (re && !exps_match_col_exps(nre,
re));
+ re = nre;
+ }
+ if (single_table) { /* add PROP_HASHCOL to all column
exps */
+ for( n = exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ /* swapped ? */
+ if (is_join(rel->op) &&
+ ((left && !rel_find_exp(rel->l,
e->l)) ||
+ (!left && !rel_find_exp(rel->r,
e->l))))
+ n->data = e =
exp_compare(sql->sa, e->r, e->l, cmp_equal);
+ p = find_prop(e->p, PROP_HASHCOL);
+ if (!p)
+ e->p = p = prop_create(sql->sa,
PROP_HASHCOL, e->p);
+ p->value = i;
+ }
}
/* add the remaining exps to the new exp list */
if (list_length(rel->exps) > list_length(exps)) {
diff --git a/sql/test/BugTracker-2012/Tests/All
b/sql/test/BugTracker-2012/Tests/All
--- a/sql/test/BugTracker-2012/Tests/All
+++ b/sql/test/BugTracker-2012/Tests/All
@@ -56,3 +56,4 @@ timestamp-diff.Bug-3190
string-insert-default-null-crash.Bug-3168
case_evaluated_too_early.Bug-3186
recursive_optimizer.Bug-3191
+join_over_multitable_using_index.Bug-3181
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list