]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Revert "Flush Memoize cache when non-key parameters change"
authorDavid Rowley <drowley@postgresql.org>
Wed, 24 Nov 2021 02:28:34 +0000 (15:28 +1300)
committerDavid Rowley <drowley@postgresql.org>
Wed, 24 Nov 2021 02:28:34 +0000 (15:28 +1300)
This reverts commit f94edb06ab60545a0e9e90aedc39e3b81b2b9e3f.

src/backend/executor/nodeMemoize.c
src/backend/nodes/bitmapset.c
src/backend/optimizer/plan/createplan.c
src/backend/optimizer/util/clauses.c
src/include/nodes/execnodes.h
src/include/nodes/plannodes.h
src/include/optimizer/clauses.h
src/test/regress/expected/memoize.out
src/test/regress/sql/memoize.sql

index fde8ebd506862073c3cac3ef9f44e18de08302fa..cff7ee504691dac3a02c6e2989b8239fe73f06a3 100644 (file)
@@ -367,37 +367,6 @@ remove_cache_entry(MemoizeState *mstate, MemoizeEntry *entry)
        pfree(key);
 }
 
-/*
- * 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
@@ -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);
 }
 
 /*
index bff70cfb1ab179497fc4ec7202a3ce8cc9cca923..649478b0d4d39f5ac5c1dde6bc092c9ffa2b14c4 100644 (file)
@@ -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)
index 5658f24323f2a2bc51539fc1f793983401fded07..cc8d44bdc0934c67f87ff132279e905d91c5479b 100644 (file)
@@ -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);
 
@@ -6422,7 +6419,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;
@@ -6439,7 +6436,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;
 }
index 9d7aa8b10ff2217a8465c211b930665ddc6b49d1..4d0e093b314f77403bc31b78d4666afc8b92b75e 100644 (file)
@@ -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);
 
 
 /*****************************************************************************
@@ -5168,33 +5167,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);
-}
index 14246e72a72b5fc33dc027e7b2cb50a1ef77ffd5..8341c2b8a165af250758e6a38e007c826aabb5e6 100644 (file)
@@ -2112,8 +2112,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;
 
 /* ----------------
index 5ddf9479715add018bd40477ed21ad9229999904..e29c1ad81803e399ef85b690c4dbdb5f86662268 100644 (file)
@@ -801,7 +801,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;
 
 /* ----------------
index bc3f3e60d43282c8240001824b5e2ee61a21e5d8..0673887a852c054f6ddac1e55d2593a6975de20a 100644 (file)
@@ -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 */
index 9102957927b612c5eb160921b7d013168ee102b4..0ed5d8474af090f61e1ded4205e49455702edb5a 100644 (file)
@@ -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;
index 00f38f933cc77da90c2a50247af88c9b909bffa2..3c7360adf9c8f74d2fb6ee9462b7d32ee06d3985 100644 (file)
@@ -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;