Changeset: 16436e3143de for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/16436e3143de
Modified Files:
sql/include/sql_relation.h
sql/server/rel_statistics.c
Branch: properties
Log Message:
Don't gather statistics for a relation multiple times if it has more than 1
reference
diffs (48 lines):
diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -299,7 +299,7 @@ typedef struct relation {
/*
* Used by rewriters at rel_unnest, rel_optimizer and rel_distribute so
a relation is not modified twice
* All bits are used by rel_unnest modifiers and always reset after.
- * The first bit is also used by rel_dce and rel_merge_select_rse
optimizers.
+ * The first bit is also used by rel_dce and rel_merge_select_rse
optimizers and rel_get_statistics
* The third bit is used by rel_remote_func only and it's not reset.
*/
used:3;
diff --git a/sql/server/rel_statistics.c b/sql/server/rel_statistics.c
--- a/sql/server/rel_statistics.c
+++ b/sql/server/rel_statistics.c
@@ -11,6 +11,9 @@
#include "rel_statistics.h"
#include "rel_rewriter.h"
+#define statistics_gathered (1 << 0)
+#define are_statistics_gathered(X) ((X & statistics_gathered) ==
statistics_gathered)
+
static sql_exp *
comparison_find_column(sql_exp *input, sql_exp *e)
{
@@ -535,6 +538,11 @@ rel_prune_predicates(visitor *v, sql_rel
static sql_rel *
rel_get_statistics_(visitor *v, sql_rel *rel)
{
+ /* Don't look at the same relation twice */
+ if (are_statistics_gathered(rel->used))
+ return rel;
+ rel->used |= statistics_gathered;
+
switch(rel->op){
case op_basetable:
rel->exps = exps_exp_visitor_bottomup(v, rel, rel->exps, 0,
&rel_basetable_get_statistics, false);
@@ -624,7 +632,9 @@ static sql_rel *
rel_get_statistics(visitor *v, global_props *gp, sql_rel *rel)
{
(void) gp;
- return rel_visitor_bottomup(v, rel, &rel_get_statistics_);
+ rel = rel_visitor_bottomup(v, rel, &rel_get_statistics_);
+ /*reset used flag */
+ return rel_visitor_bottomup(v, rel, &rewrite_reset_used);
}
run_optimizer
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]