mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Restore foreign-key-aware estimation of join relation sizes.
This patch provides a new implementation of the logic added by commit137805f89and later removed by77ba61080. It differs from the original primarily in expending much less effort per joinrel in large queries, which it accomplishes by doing most of the matching work once per query not once per joinrel. Hopefully, it's also less buggy and better commented. The never-documented enable_fkey_estimates GUC remains gone. There remains work to be done to make the selectivity estimates account for nulls in FK referencing columns; but that was true of the original patch as well. We may be able to address this point later in beta. In the meantime, any error should be in the direction of overestimating rather than underestimating joinrel sizes, which seems like the direction we want to err in. Tomas Vondra and Tom Lane Discussion: <31041.1465069446@sss.pgh.pa.us>
This commit is contained in:
		@@ -251,6 +251,8 @@ typedef struct PlannerInfo
 | 
			
		||||
 | 
			
		||||
	List	   *placeholder_list;		/* list of PlaceHolderInfos */
 | 
			
		||||
 | 
			
		||||
	List	   *fkey_list;		/* list of ForeignKeyOptInfos */
 | 
			
		||||
 | 
			
		||||
	List	   *query_pathkeys; /* desired pathkeys for query_planner() */
 | 
			
		||||
 | 
			
		||||
	List	   *group_pathkeys; /* groupClause pathkeys, if any */
 | 
			
		||||
@@ -622,6 +624,36 @@ typedef struct IndexOptInfo
 | 
			
		||||
	void		(*amcostestimate) ();	/* AM's cost estimator */
 | 
			
		||||
} IndexOptInfo;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ForeignKeyOptInfo
 | 
			
		||||
 *		Per-foreign-key information for planning/optimization
 | 
			
		||||
 *
 | 
			
		||||
 * The per-FK-column arrays can be fixed-size because we allow at most
 | 
			
		||||
 * INDEX_MAX_KEYS columns in a foreign key constraint.  Each array has
 | 
			
		||||
 * nkeys valid entries.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct ForeignKeyOptInfo
 | 
			
		||||
{
 | 
			
		||||
	NodeTag		type;
 | 
			
		||||
 | 
			
		||||
	/* Basic data about the foreign key (fetched from catalogs): */
 | 
			
		||||
	Index		con_relid;		/* RT index of the referencing table */
 | 
			
		||||
	Index		ref_relid;		/* RT index of the referenced table */
 | 
			
		||||
	int			nkeys;			/* number of columns in the foreign key */
 | 
			
		||||
	AttrNumber	conkey[INDEX_MAX_KEYS]; /* cols in referencing table */
 | 
			
		||||
	AttrNumber	confkey[INDEX_MAX_KEYS];		/* cols in referenced table */
 | 
			
		||||
	Oid			conpfeqop[INDEX_MAX_KEYS];		/* PK = FK operator OIDs */
 | 
			
		||||
 | 
			
		||||
	/* Derived info about whether FK's equality conditions match the query: */
 | 
			
		||||
	int			nmatched_ec;	/* # of FK cols matched by ECs */
 | 
			
		||||
	int			nmatched_rcols; /* # of FK cols matched by non-EC rinfos */
 | 
			
		||||
	int			nmatched_ri;	/* total # of non-EC rinfos matched to FK */
 | 
			
		||||
	/* Pointer to eclass matching each column's condition, if there is one */
 | 
			
		||||
	struct EquivalenceClass *eclass[INDEX_MAX_KEYS];
 | 
			
		||||
	/* List of non-EC RestrictInfos matching each column's condition */
 | 
			
		||||
	List	   *rinfos[INDEX_MAX_KEYS];
 | 
			
		||||
} ForeignKeyOptInfo;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * EquivalenceClasses
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user