summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rowley2021-11-24 02:27:43 +0000
committerDavid Rowley2021-11-24 02:27:43 +0000
commitdad20ad4709f602b4827a1ab2b0e715f36c548c3 (patch)
treea6c96abbe3eae534d938d05539627b4f03d23f62
parent1050048a315790a505465bfcceb26eaf8dbc7e2e (diff)
Revert "Flush Memoize cache when non-key parameters change"
This reverts commit 1050048a315790a505465bfcceb26eaf8dbc7e2e.
-rw-r--r--src/backend/executor/nodeMemoize.c38
-rw-r--r--src/backend/nodes/bitmapset.c2
-rw-r--r--src/backend/optimizer/plan/createplan.c10
-rw-r--r--src/backend/optimizer/util/clauses.c31
-rw-r--r--src/include/nodes/execnodes.h2
-rw-r--r--src/include/nodes/plannodes.h1
-rw-r--r--src/include/optimizer/clauses.h2
-rw-r--r--src/test/regress/expected/memoize.out39
-rw-r--r--src/test/regress/sql/memoize.sql20
9 files changed, 3 insertions, 142 deletions
diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c
index 31e39722239..683502dd90e 100644
--- a/src/backend/executor/nodeMemoize.c
+++ b/src/backend/executor/nodeMemoize.c
@@ -368,37 +368,6 @@ remove_cache_entry(MemoizeState *mstate, MemoizeEntry *entry)
}
/*
- * cache_purge_all
- * Remove all items from the cache
- */
-static void
-cache_purge_all(MemoizeState *mstate)
-{
- uint64 evictions = mstate->hashtable->members;
- PlanState *pstate = (PlanState *) mstate;
-
- /*
- * Likely the most efficient way to remove all items is to just reset the
- * memory context for the cache and then rebuild a fresh hash table. This
- * saves having to remove each item one by one and pfree each cached tuple
- */
- MemoryContextReset(mstate->tableContext);
-
- /* Make the hash table the same size as the original size */
- build_hash_table(mstate, ((Memoize *) pstate->plan)->est_entries);
-
- /* reset the LRU list */
- dlist_init(&mstate->lru_list);
- mstate->last_tuple = NULL;
- mstate->entry = NULL;
-
- mstate->mem_used = 0;
-
- /* XXX should we add something new to track these purges? */
- mstate->stats.cache_evictions += evictions; /* Update Stats */
-}
-
-/*
* cache_reduce_memory
* Evict older and less recently used items from the cache in order to
* reduce the memory consumption back to something below the
@@ -1010,7 +979,6 @@ ExecInitMemoize(Memoize *node, EState *estate, int eflags)
* getting the first tuple. This allows us to mark it as so.
*/
mstate->singlerow = node->singlerow;
- mstate->keyparamids = node->keyparamids;
/*
* Record if the cache keys should be compared bit by bit, or logically
@@ -1114,12 +1082,6 @@ ExecReScanMemoize(MemoizeState *node)
if (outerPlan->chgParam == NULL)
ExecReScan(outerPlan);
- /*
- * Purge the entire cache if a parameter changed that is not part of the
- * cache key.
- */
- if (bms_nonempty_difference(outerPlan->chgParam, node->keyparamids))
- cache_purge_all(node);
}
/*
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c
index bff70cfb1ab..649478b0d4d 100644
--- a/src/backend/nodes/bitmapset.c
+++ b/src/backend/nodes/bitmapset.c
@@ -540,8 +540,6 @@ bms_overlap_list(const Bitmapset *a, const List *b)
/*
* bms_nonempty_difference - do sets have a nonempty difference?
- *
- * i.e., are any members set in 'a' that are not also set in 'b'.
*/
bool
bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b)
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index f12660a2606..866f19f64c1 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -280,7 +280,7 @@ static Material *make_material(Plan *lefttree);
static Memoize *make_memoize(Plan *lefttree, Oid *hashoperators,
Oid *collations, List *param_exprs,
bool singlerow, bool binary_mode,
- uint32 est_entries, Bitmapset *keyparamids);
+ uint32 est_entries);
static WindowAgg *make_windowagg(List *tlist, Index winref,
int partNumCols, AttrNumber *partColIdx, Oid *partOperators, Oid *partCollations,
int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators, Oid *ordCollations,
@@ -1586,7 +1586,6 @@ static Memoize *
create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags)
{
Memoize *plan;
- Bitmapset *keyparamids;
Plan *subplan;
Oid *operators;
Oid *collations;
@@ -1618,11 +1617,9 @@ create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags)
i++;
}
- keyparamids = pull_paramids((Expr *) param_exprs);
-
plan = make_memoize(subplan, operators, collations, param_exprs,
best_path->singlerow, best_path->binary_mode,
- best_path->est_entries, keyparamids);
+ best_path->est_entries);
copy_generic_path_info(&plan->plan, (Path *) best_path);
@@ -6423,7 +6420,7 @@ materialize_finished_plan(Plan *subplan)
static Memoize *
make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations,
List *param_exprs, bool singlerow, bool binary_mode,
- uint32 est_entries, Bitmapset *keyparamids)
+ uint32 est_entries)
{
Memoize *node = makeNode(Memoize);
Plan *plan = &node->plan;
@@ -6440,7 +6437,6 @@ make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations,
node->singlerow = singlerow;
node->binary_mode = binary_mode;
node->est_entries = est_entries;
- node->keyparamids = keyparamids;
return node;
}
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index 873e43bfe64..109f93d109d 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -152,7 +152,6 @@ static Query *substitute_actual_srf_parameters(Query *expr,
int nargs, List *args);
static Node *substitute_actual_srf_parameters_mutator(Node *node,
substitute_actual_srf_parameters_context *context);
-static bool pull_paramids_walker(Node *node, Bitmapset **context);
/*****************************************************************************
@@ -5215,33 +5214,3 @@ substitute_actual_srf_parameters_mutator(Node *node,
substitute_actual_srf_parameters_mutator,
(void *) context);
}
-
-/*
- * pull_paramids
- * Returns a Bitmapset containing the paramids of all Params in 'expr'.
- */
-Bitmapset *
-pull_paramids(Expr *expr)
-{
- Bitmapset *result = NULL;
-
- (void) pull_paramids_walker((Node *) expr, &result);
-
- return result;
-}
-
-static bool
-pull_paramids_walker(Node *node, Bitmapset **context)
-{
- if (node == NULL)
- return false;
- if (IsA(node, Param))
- {
- Param *param = (Param *)node;
-
- *context = bms_add_member(*context, param->paramid);
- return false;
- }
- return expression_tree_walker(node, pull_paramids_walker,
- (void *) context);
-}
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index ddc35293326..d96ace32e43 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -2113,8 +2113,6 @@ typedef struct MemoizeState
* by bit, false when using hash equality ops */
MemoizeInstrumentation stats; /* execution statistics */
SharedMemoizeInfo *shared_info; /* statistics for parallel workers */
- Bitmapset *keyparamids; /* Param->paramids of expressions belonging to
- * param_exprs */
} MemoizeState;
/* ----------------
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index be3c30704ad..f1328be3549 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -804,7 +804,6 @@ typedef struct Memoize
uint32 est_entries; /* The maximum number of entries that the
* planner expects will fit in the cache, or 0
* if unknown */
- Bitmapset *keyparamids; /* paramids from param_exprs */
} Memoize;
/* ----------------
diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h
index bc3f3e60d43..0673887a852 100644
--- a/src/include/optimizer/clauses.h
+++ b/src/include/optimizer/clauses.h
@@ -53,6 +53,4 @@ extern void CommuteOpExpr(OpExpr *clause);
extern Query *inline_set_returning_function(PlannerInfo *root,
RangeTblEntry *rte);
-extern Bitmapset *pull_paramids(Expr *expr);
-
#endif /* CLAUSES_H */
diff --git a/src/test/regress/expected/memoize.out b/src/test/regress/expected/memoize.out
index 9102957927b..0ed5d8474af 100644
--- a/src/test/regress/expected/memoize.out
+++ b/src/test/regress/expected/memoize.out
@@ -196,45 +196,6 @@ SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false);
(8 rows)
DROP TABLE strtest;
--- Exercise Memoize code that flushes the cache when a parameter changes which
--- is not part of the cache key.
--- Ensure we get a Memoize plan
-EXPLAIN (COSTS OFF)
-SELECT UNIQUE1 FROM tenk1 t0
-WHERE unique1 < 3
- AND EXISTS (
- SELECT 1 FROM tenk1 t1
- INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred
- WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0);
- QUERY PLAN
-----------------------------------------------------------------
- Index Scan using tenk1_unique1 on tenk1 t0
- Index Cond: (unique1 < 3)
- Filter: (SubPlan 1)
- SubPlan 1
- -> Nested Loop
- -> Index Scan using tenk2_hundred on tenk2 t2
- Filter: (t0.two <> four)
- -> Memoize
- Cache Key: t2.hundred
- Cache Mode: logical
- -> Index Scan using tenk1_unique1 on tenk1 t1
- Index Cond: (unique1 = t2.hundred)
- Filter: (t0.ten = twenty)
-(13 rows)
-
--- Ensure the above query returns the correct result
-SELECT UNIQUE1 FROM tenk1 t0
-WHERE unique1 < 3
- AND EXISTS (
- SELECT 1 FROM tenk1 t1
- INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred
- WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0);
- unique1
----------
- 2
-(1 row)
-
RESET enable_seqscan;
RESET enable_mergejoin;
RESET work_mem;
diff --git a/src/test/regress/sql/memoize.sql b/src/test/regress/sql/memoize.sql
index 00f38f933cc..3c7360adf9c 100644
--- a/src/test/regress/sql/memoize.sql
+++ b/src/test/regress/sql/memoize.sql
@@ -103,26 +103,6 @@ SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false);
DROP TABLE strtest;
--- Exercise Memoize code that flushes the cache when a parameter changes which
--- is not part of the cache key.
-
--- Ensure we get a Memoize plan
-EXPLAIN (COSTS OFF)
-SELECT UNIQUE1 FROM tenk1 t0
-WHERE unique1 < 3
- AND EXISTS (
- SELECT 1 FROM tenk1 t1
- INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred
- WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0);
-
--- Ensure the above query returns the correct result
-SELECT UNIQUE1 FROM tenk1 t0
-WHERE unique1 < 3
- AND EXISTS (
- SELECT 1 FROM tenk1 t1
- INNER JOIN tenk2 t2 ON t1.unique1 = t2.hundred
- WHERE t0.ten = t1.twenty AND t0.two <> t2.four OFFSET 0);
-
RESET enable_seqscan;
RESET enable_mergejoin;
RESET work_mem;