mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Revert "Flush Memoize cache when non-key parameters change"
This reverts commit 1050048a315790a505465bfcceb26eaf8dbc7e2e.
This commit is contained in:
		
							parent
							
								
									1050048a31
								
							
						
					
					
						commit
						dad20ad470
					
				| @ -367,37 +367,6 @@ remove_cache_entry(MemoizeState *mstate, MemoizeEntry *entry) | |||||||
| 	pfree(key); | 	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 |  * cache_reduce_memory | ||||||
|  *		Evict older and less recently used items from the cache in order to |  *		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. | 	 * getting the first tuple.  This allows us to mark it as so. | ||||||
| 	 */ | 	 */ | ||||||
| 	mstate->singlerow = node->singlerow; | 	mstate->singlerow = node->singlerow; | ||||||
| 	mstate->keyparamids = node->keyparamids; |  | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Record if the cache keys should be compared bit by bit, or logically | 	 * Record if the cache keys should be compared bit by bit, or logically | ||||||
| @ -1114,12 +1082,6 @@ ExecReScanMemoize(MemoizeState *node) | |||||||
| 	if (outerPlan->chgParam == NULL) | 	if (outerPlan->chgParam == NULL) | ||||||
| 		ExecReScan(outerPlan); | 		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); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  | |||||||
| @ -540,8 +540,6 @@ bms_overlap_list(const Bitmapset *a, const List *b) | |||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * bms_nonempty_difference - do sets have a nonempty difference? |  * 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 | bool | ||||||
| bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b) | bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b) | ||||||
|  | |||||||
| @ -280,7 +280,7 @@ static Material *make_material(Plan *lefttree); | |||||||
| static Memoize *make_memoize(Plan *lefttree, Oid *hashoperators, | static Memoize *make_memoize(Plan *lefttree, Oid *hashoperators, | ||||||
| 							 Oid *collations, List *param_exprs, | 							 Oid *collations, List *param_exprs, | ||||||
| 							 bool singlerow, bool binary_mode, | 							 bool singlerow, bool binary_mode, | ||||||
| 							 uint32 est_entries, Bitmapset *keyparamids); | 							 uint32 est_entries); | ||||||
| static WindowAgg *make_windowagg(List *tlist, Index winref, | static WindowAgg *make_windowagg(List *tlist, Index winref, | ||||||
| 								 int partNumCols, AttrNumber *partColIdx, Oid *partOperators, Oid *partCollations, | 								 int partNumCols, AttrNumber *partColIdx, Oid *partOperators, Oid *partCollations, | ||||||
| 								 int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators, Oid *ordCollations, | 								 int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators, Oid *ordCollations, | ||||||
| @ -1586,7 +1586,6 @@ static Memoize * | |||||||
| create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags) | create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags) | ||||||
| { | { | ||||||
| 	Memoize    *plan; | 	Memoize    *plan; | ||||||
| 	Bitmapset  *keyparamids; |  | ||||||
| 	Plan	   *subplan; | 	Plan	   *subplan; | ||||||
| 	Oid		   *operators; | 	Oid		   *operators; | ||||||
| 	Oid		   *collations; | 	Oid		   *collations; | ||||||
| @ -1618,11 +1617,9 @@ create_memoize_plan(PlannerInfo *root, MemoizePath *best_path, int flags) | |||||||
| 		i++; | 		i++; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	keyparamids = pull_paramids((Expr *) param_exprs); |  | ||||||
| 
 |  | ||||||
| 	plan = make_memoize(subplan, operators, collations, param_exprs, | 	plan = make_memoize(subplan, operators, collations, param_exprs, | ||||||
| 						best_path->singlerow, best_path->binary_mode, | 						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); | 	copy_generic_path_info(&plan->plan, (Path *) best_path); | ||||||
| 
 | 
 | ||||||
| @ -6423,7 +6420,7 @@ materialize_finished_plan(Plan *subplan) | |||||||
| static Memoize * | static Memoize * | ||||||
| make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations, | make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations, | ||||||
| 			 List *param_exprs, bool singlerow, bool binary_mode, | 			 List *param_exprs, bool singlerow, bool binary_mode, | ||||||
| 			 uint32 est_entries, Bitmapset *keyparamids) | 			 uint32 est_entries) | ||||||
| { | { | ||||||
| 	Memoize    *node = makeNode(Memoize); | 	Memoize    *node = makeNode(Memoize); | ||||||
| 	Plan	   *plan = &node->plan; | 	Plan	   *plan = &node->plan; | ||||||
| @ -6440,7 +6437,6 @@ make_memoize(Plan *lefttree, Oid *hashoperators, Oid *collations, | |||||||
| 	node->singlerow = singlerow; | 	node->singlerow = singlerow; | ||||||
| 	node->binary_mode = binary_mode; | 	node->binary_mode = binary_mode; | ||||||
| 	node->est_entries = est_entries; | 	node->est_entries = est_entries; | ||||||
| 	node->keyparamids = keyparamids; |  | ||||||
| 
 | 
 | ||||||
| 	return node; | 	return node; | ||||||
| } | } | ||||||
|  | |||||||
| @ -152,7 +152,6 @@ static Query *substitute_actual_srf_parameters(Query *expr, | |||||||
| 											   int nargs, List *args); | 											   int nargs, List *args); | ||||||
| static Node *substitute_actual_srf_parameters_mutator(Node *node, | static Node *substitute_actual_srf_parameters_mutator(Node *node, | ||||||
| 													  substitute_actual_srf_parameters_context *context); | 													  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, | 								   substitute_actual_srf_parameters_mutator, | ||||||
| 								   (void *) context); | 								   (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); |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -2113,8 +2113,6 @@ typedef struct MemoizeState | |||||||
| 								 * by bit, false when using hash equality ops */ | 								 * by bit, false when using hash equality ops */ | ||||||
| 	MemoizeInstrumentation stats;	/* execution statistics */ | 	MemoizeInstrumentation stats;	/* execution statistics */ | ||||||
| 	SharedMemoizeInfo *shared_info; /* statistics for parallel workers */ | 	SharedMemoizeInfo *shared_info; /* statistics for parallel workers */ | ||||||
| 	Bitmapset	   *keyparamids; /* Param->paramids of expressions belonging to
 |  | ||||||
| 								  * param_exprs */ |  | ||||||
| } MemoizeState; | } MemoizeState; | ||||||
| 
 | 
 | ||||||
| /* ----------------
 | /* ----------------
 | ||||||
|  | |||||||
| @ -804,7 +804,6 @@ typedef struct Memoize | |||||||
| 	uint32		est_entries;	/* The maximum number of entries that the
 | 	uint32		est_entries;	/* The maximum number of entries that the
 | ||||||
| 								 * planner expects will fit in the cache, or 0 | 								 * planner expects will fit in the cache, or 0 | ||||||
| 								 * if unknown */ | 								 * if unknown */ | ||||||
| 	Bitmapset   *keyparamids;	/* paramids from param_exprs */ |  | ||||||
| } Memoize; | } Memoize; | ||||||
| 
 | 
 | ||||||
| /* ----------------
 | /* ----------------
 | ||||||
|  | |||||||
| @ -53,6 +53,4 @@ extern void CommuteOpExpr(OpExpr *clause); | |||||||
| extern Query *inline_set_returning_function(PlannerInfo *root, | extern Query *inline_set_returning_function(PlannerInfo *root, | ||||||
| 											RangeTblEntry *rte); | 											RangeTblEntry *rte); | ||||||
| 
 | 
 | ||||||
| extern Bitmapset *pull_paramids(Expr *expr); |  | ||||||
| 
 |  | ||||||
| #endif							/* CLAUSES_H */ | #endif							/* CLAUSES_H */ | ||||||
|  | |||||||
| @ -196,45 +196,6 @@ SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false); | |||||||
| (8 rows) | (8 rows) | ||||||
| 
 | 
 | ||||||
| DROP TABLE strtest; | 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_seqscan; | ||||||
| RESET enable_mergejoin; | RESET enable_mergejoin; | ||||||
| RESET work_mem; | RESET work_mem; | ||||||
|  | |||||||
| @ -103,26 +103,6 @@ SELECT * FROM strtest s1 INNER JOIN strtest s2 ON s1.t >= s2.t;', false); | |||||||
| 
 | 
 | ||||||
| DROP TABLE strtest; | 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_seqscan; | ||||||
| RESET enable_mergejoin; | RESET enable_mergejoin; | ||||||
| RESET work_mem; | RESET work_mem; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user