PostgreSQL Source Code git master
Loading...
Searching...
No Matches
vacuum.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * vacuum.h
4 * header file for postgres vacuum cleaner and statistics analyzer
5 *
6 *
7 * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/commands/vacuum.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef VACUUM_H
15#define VACUUM_H
16
17#include "access/htup.h"
18#include "access/genam.h"
19#include "access/parallel.h"
20#include "access/tidstore.h"
21#include "catalog/pg_class.h"
23#include "catalog/pg_type.h"
24#include "parser/parse_node.h"
25#include "storage/buf.h"
26#include "utils/relcache.h"
27
28/*
29 * Flags for amparallelvacuumoptions to control the participation of bulkdelete
30 * and vacuumcleanup in parallel vacuum.
31 */
32
33/*
34 * Both bulkdelete and vacuumcleanup are disabled by default. This will be
35 * used by IndexAM's that don't want to or cannot participate in parallel
36 * vacuum. For example, if an index AM doesn't have a way to communicate the
37 * index statistics allocated by the first ambulkdelete call to the subsequent
38 * ones until amvacuumcleanup, the index AM cannot participate in parallel
39 * vacuum.
40 */
41#define VACUUM_OPTION_NO_PARALLEL 0
42
43/*
44 * bulkdelete can be performed in parallel. This option can be used by
45 * index AMs that need to scan indexes to delete tuples.
46 */
47#define VACUUM_OPTION_PARALLEL_BULKDEL (1 << 0)
48
49/*
50 * vacuumcleanup can be performed in parallel if bulkdelete is not performed
51 * yet. This will be used by IndexAM's that can scan the index if the
52 * bulkdelete is not performed.
53 */
54#define VACUUM_OPTION_PARALLEL_COND_CLEANUP (1 << 1)
55
56/*
57 * vacuumcleanup can be performed in parallel even if bulkdelete has already
58 * processed the index. This will be used by IndexAM's that scan the index
59 * during the cleanup phase of index irrespective of whether the index is
60 * already scanned or not during bulkdelete phase.
61 */
62#define VACUUM_OPTION_PARALLEL_CLEANUP (1 << 2)
63
64/* value for checking vacuum flags */
65#define VACUUM_OPTION_MAX_VALID_VALUE ((1 << 3) - 1)
66
67/* Abstract type for parallel vacuum state */
69
70/*----------
71 * ANALYZE builds one of these structs for each attribute (column) that is
72 * to be analyzed. The struct and subsidiary data are in anl_context,
73 * so they live until the end of the ANALYZE operation.
74 *
75 * The type-specific typanalyze function is passed a pointer to this struct
76 * and must return true to continue analysis, false to skip analysis of this
77 * column. In the true case it must set the compute_stats and minrows fields,
78 * and can optionally set extra_data to pass additional info to compute_stats.
79 * minrows is its request for the minimum number of sample rows to be gathered
80 * (but note this request might not be honored, eg if there are fewer rows
81 * than that in the table).
82 *
83 * The compute_stats routine will be called after sample rows have been
84 * gathered. Aside from this struct, it is passed:
85 * fetchfunc: a function for accessing the column values from the
86 * sample rows
87 * samplerows: the number of sample tuples
88 * totalrows: estimated total number of rows in relation
89 * The fetchfunc may be called with rownum running from 0 to samplerows-1.
90 * It returns a Datum and an isNull flag.
91 *
92 * compute_stats should set stats_valid true if it is able to compute
93 * any useful statistics. If it does, the remainder of the struct holds
94 * the information to be stored in a pg_statistic row for the column. Be
95 * careful to allocate any pointed-to data in anl_context, which will NOT
96 * be CurrentMemoryContext when compute_stats is called.
97 *
98 * Note: all comparisons done for statistical purposes should use the
99 * underlying column's collation (attcollation), except in situations
100 * where a noncollatable container type contains a collatable type;
101 * in that case use the type's default collation. Be sure to record
102 * the appropriate collation in stacoll.
103 *----------
104 */
106
107typedef Datum (*AnalyzeAttrFetchFunc) (VacAttrStatsP stats, int rownum,
108 bool *isNull);
109
112 int samplerows,
113 double totalrows);
114
115typedef struct VacAttrStats
116{
117 /*
118 * These fields are set up by the main ANALYZE code before invoking the
119 * type-specific typanalyze function. They don't necessarily match what
120 * is in pg_attribute, because some index opclasses store a different type
121 * than the underlying column/expression. Therefore, use these fields for
122 * information about the datatype being fed to the typanalyze function.
123 */
124 int attstattarget; /* -1 to use default */
125 Oid attrtypid; /* type of data being analyzed */
126 int32 attrtypmod; /* typmod of data being analyzed */
127 Form_pg_type attrtype; /* copy of pg_type row for attrtypid */
128 Oid attrcollid; /* collation of data being analyzed */
129 MemoryContext anl_context; /* where to save long-lived data */
130
131 /*
132 * These fields must be filled in by the typanalyze routine, unless it
133 * returns false.
134 */
136 int minrows; /* Minimum # of rows wanted for stats */
137 void *extra_data; /* for extra type-specific data */
138
139 /*
140 * These fields are to be filled in by the compute_stats routine. (They
141 * are initialized to zero when the struct is created.)
142 */
144 float4 stanullfrac; /* fraction of entries that are NULL */
145 int32 stawidth; /* average width of column values */
146 float4 stadistinct; /* # distinct values */
154
155 /*
156 * These fields describe the stavalues[n] element types. They will be
157 * initialized to match attrtypid, but a custom typanalyze function might
158 * want to store an array of something other than the analyzed column's
159 * elements. It should then overwrite these fields.
160 */
165
166 /*
167 * These fields are private to the main ANALYZE code and should not be
168 * looked at by type-specific functions.
169 */
170 int tupattnum; /* attribute number within tuples */
171 HeapTuple *rows; /* access info for std fetch function */
173 Datum *exprvals; /* access info for index fetch function */
177
178/* flag bits for VacuumParams->options */
179#define VACOPT_VACUUM 0x01 /* do VACUUM */
180#define VACOPT_ANALYZE 0x02 /* do ANALYZE */
181#define VACOPT_VERBOSE 0x04 /* output INFO instrumentation messages */
182#define VACOPT_FREEZE 0x08 /* FREEZE option */
183#define VACOPT_FULL 0x10 /* FULL (non-concurrent) vacuum */
184#define VACOPT_SKIP_LOCKED 0x20 /* skip if cannot get lock */
185#define VACOPT_PROCESS_MAIN 0x40 /* process main relation */
186#define VACOPT_PROCESS_TOAST 0x80 /* process the TOAST table, if any */
187#define VACOPT_DISABLE_PAGE_SKIPPING 0x100 /* don't skip any pages */
188#define VACOPT_SKIP_DATABASE_STATS 0x200 /* skip vac_update_datfrozenxid() */
189#define VACOPT_ONLY_DATABASE_STATS 0x400 /* only vac_update_datfrozenxid() */
190
191/*
192 * Values used by index_cleanup and truncate params.
193 *
194 * VACOPTVALUE_UNSPECIFIED is used as an initial placeholder when VACUUM
195 * command has no explicit value. When that happens the final usable value
196 * comes from the corresponding reloption (though the reloption default is
197 * usually used).
198 */
206
207/*
208 * Parameters customizing behavior of VACUUM and ANALYZE.
209 *
210 * Note that at least one of VACOPT_VACUUM and VACOPT_ANALYZE must be set
211 * in options.
212 *
213 * When adding a new VacuumParam member, consider adding it to vacuumdb as
214 * well.
215 */
216typedef struct VacuumParams
217{
218 uint32 options; /* bitmask of VACOPT_* */
219 int freeze_min_age; /* min freeze age, -1 to use default */
220 int freeze_table_age; /* age at which to scan whole table */
221 int multixact_freeze_min_age; /* min multixact freeze age, -1 to
222 * use default */
223 int multixact_freeze_table_age; /* multixact age at which to scan
224 * whole table */
225 bool is_wraparound; /* force a for-wraparound vacuum */
226 int log_vacuum_min_duration; /* minimum execution threshold in
227 * ms at which vacuum by
228 * autovacuum is logged, -1 to use
229 * default */
230 int log_analyze_min_duration; /* minimum execution threshold in
231 * ms at which analyze by
232 * autovacuum is logged, -1 to use
233 * default */
234 VacOptValue index_cleanup; /* Do index vacuum and cleanup */
235 VacOptValue truncate; /* Truncate empty pages at the end */
236 Oid toast_parent; /* for privilege checks when recursing */
237
238 /*
239 * Fraction of pages in a relation that vacuum can eagerly scan and fail
240 * to freeze. Only applicable for table AMs using visibility maps. Derived
241 * from GUC or table storage parameter. 0 if disabled.
242 */
244
245 /*
246 * The number of parallel vacuum workers. 0 by default which means choose
247 * based on the number of indexes. -1 indicates parallel vacuum is
248 * disabled.
249 */
252
253/*
254 * VacuumCutoffs is immutable state that describes the cutoffs used by VACUUM.
255 * Established at the beginning of each VACUUM operation.
256 */
258{
259 /*
260 * Existing pg_class fields at start of VACUUM
261 */
264
265 /*
266 * OldestXmin is the Xid below which tuples deleted by any xact (that
267 * committed) should be considered DEAD, not just RECENTLY_DEAD.
268 *
269 * OldestMxact is the Mxid below which MultiXacts are definitely not seen
270 * as visible by any running transaction.
271 *
272 * OldestXmin and OldestMxact are also the most recent values that can
273 * ever be passed to vac_update_relstats() as frozenxid and minmulti
274 * arguments at the end of VACUUM. These same values should be passed
275 * when it turns out that VACUUM will leave no unfrozen XIDs/MXIDs behind
276 * in the table.
277 */
280
281 /*
282 * FreezeLimit is the Xid below which all Xids are definitely frozen or
283 * removed in pages VACUUM scans and cleanup locks.
284 *
285 * MultiXactCutoff is the value below which all MultiXactIds are
286 * definitely removed from Xmax in pages VACUUM scans and cleanup locks.
287 */
290};
291
292/*
293 * VacDeadItemsInfo stores supplemental information for dead tuple TID
294 * storage (i.e. TidStore).
295 */
296typedef struct VacDeadItemsInfo
297{
298 size_t max_bytes; /* the maximum bytes TidStore can use */
299 int64 num_items; /* current # of entries */
301
302/*
303 * Statistics for parallel vacuum workers (planned vs. actual)
304 */
305typedef struct PVWorkerStats
306{
307 /* Number of parallel workers planned to launch */
309
310 /* Number of parallel workers that were successfully launched */
313
314/*
315 * PVWorkerUsage stores information about total number of launched and
316 * planned workers during parallel vacuum (both for index vacuum and cleanup).
317 */
323
324/* GUC parameters */
325extern PGDLLIMPORT int default_statistics_target; /* PGDLLIMPORT for PostGIS */
333extern PGDLLIMPORT bool vacuum_truncate;
334
335/*
336 * Relevant for vacuums implementing eager scanning. Normal vacuums may
337 * eagerly scan some all-visible but not all-frozen pages. Since the goal
338 * is to freeze these pages, an eager scan that fails to set the page
339 * all-frozen in the VM is considered to have "failed". This is the
340 * fraction of pages in the relation vacuum may scan and fail to freeze
341 * before disabling eager scanning.
342 */
344
345/*
346 * Maximum value for default_statistics_target and per-column statistics
347 * targets. This is fairly arbitrary, mainly to prevent users from creating
348 * unreasonably large statistics that the system cannot handle well.
349 */
350#define MAX_STATISTICS_TARGET 10000
351
352/* Variables for cost-based parallel vacuum */
356
358extern PGDLLIMPORT double vacuum_cost_delay;
360
362
363/* in commands/vacuum.c */
364extern void ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel);
365extern void vacuum(List *relations, const VacuumParams *params,
367 bool isTopLevel);
368extern void vac_open_indexes(Relation relation, LOCKMODE lockmode,
369 int *nindexes, Relation **Irel);
370extern void vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode);
371extern double vac_estimate_reltuples(Relation relation,
373 BlockNumber scanned_pages,
374 double scanned_tuples);
375extern void vac_update_relstats(Relation relation,
376 BlockNumber num_pages,
377 double num_tuples,
380 bool hasindex,
381 TransactionId frozenxid,
383 bool *frozenxid_updated,
384 bool *minmulti_updated,
385 bool in_outer_xact);
386extern bool vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
387 struct VacuumCutoffs *cutoffs);
388extern bool vacuum_xid_failsafe_check(const struct VacuumCutoffs *cutoffs);
389extern void vac_update_datfrozenxid(void);
390extern void vacuum_delay_point(bool is_analyze);
393extern Relation vacuum_open_relation(Oid relid, RangeVar *relation,
394 uint32 options, bool verbose,
398 TidStore *dead_items,
399 VacDeadItemsInfo *dead_items_info);
401 IndexBulkDeleteResult *istat);
402
403/* In postmaster/autovacuum.c */
404extern void AutoVacuumUpdateCostLimit(void);
405extern void VacuumUpdateCosts(void);
406
407/* in commands/vacuumparallel.c */
409 int nindexes, int nrequested_workers,
410 int vac_work_mem, int elevel,
411 BufferAccessStrategy bstrategy);
417 long num_table_tuples,
418 int num_index_scans,
421 long num_table_tuples,
422 int num_index_scans,
423 bool estimated_count,
427extern void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc);
428
429/* in commands/analyze.c */
430extern void analyze_rel(Oid relid, RangeVar *relation,
431 const VacuumParams *params, List *va_cols, bool in_outer_xact,
432 BufferAccessStrategy bstrategy);
434 int *p_attstattarget);
435extern bool std_typanalyze(VacAttrStats *stats);
436
437/* in utils/misc/sampling.c --- duplicate of declarations in utils/sampling.h */
438extern double anl_random_fract(void);
439extern double anl_init_selection_state(int n);
440extern double anl_get_next_S(double t, int n, double *stateptr);
441
442#endif /* VACUUM_H */
uint32 BlockNumber
Definition block.h:31
#define PGDLLIMPORT
Definition c.h:1421
int64_t int64
Definition c.h:621
TransactionId MultiXactId
Definition c.h:746
int16_t int16
Definition c.h:619
int32_t int32
Definition c.h:620
uint32_t uint32
Definition c.h:624
float float4
Definition c.h:713
uint32 TransactionId
Definition c.h:736
int LOCKMODE
Definition lockdefs.h:26
int16 attnum
FormData_pg_attribute * Form_pg_attribute
static int verbose
FormData_pg_class * Form_pg_class
Definition pg_class.h:160
#define STATISTIC_NUM_SLOTS
END_CATALOG_STRUCT typedef FormData_pg_type * Form_pg_type
Definition pg_type.h:265
uint64_t Datum
Definition postgres.h:70
unsigned int Oid
static int fb(int x)
Definition pg_list.h:54
int nlaunched
Definition vacuum.h:311
PVWorkerStats vacuum
Definition vacuum.h:320
PVWorkerStats cleanup
Definition vacuum.h:321
int32 attrtypmod
Definition vacuum.h:126
bool stats_valid
Definition vacuum.h:143
float4 stanullfrac
Definition vacuum.h:144
Form_pg_type attrtype
Definition vacuum.h:127
int16 stakind[STATISTIC_NUM_SLOTS]
Definition vacuum.h:147
int tupattnum
Definition vacuum.h:170
MemoryContext anl_context
Definition vacuum.h:129
Oid statypid[STATISTIC_NUM_SLOTS]
Definition vacuum.h:161
Oid staop[STATISTIC_NUM_SLOTS]
Definition vacuum.h:148
Oid stacoll[STATISTIC_NUM_SLOTS]
Definition vacuum.h:149
char statypalign[STATISTIC_NUM_SLOTS]
Definition vacuum.h:164
float4 * stanumbers[STATISTIC_NUM_SLOTS]
Definition vacuum.h:151
int rowstride
Definition vacuum.h:175
Oid attrtypid
Definition vacuum.h:125
HeapTuple * rows
Definition vacuum.h:171
int minrows
Definition vacuum.h:136
int attstattarget
Definition vacuum.h:124
int32 stawidth
Definition vacuum.h:145
void * extra_data
Definition vacuum.h:137
bool statypbyval[STATISTIC_NUM_SLOTS]
Definition vacuum.h:163
int16 statyplen[STATISTIC_NUM_SLOTS]
Definition vacuum.h:162
bool * exprnulls
Definition vacuum.h:174
TupleDesc tupDesc
Definition vacuum.h:172
Datum * exprvals
Definition vacuum.h:173
int numvalues[STATISTIC_NUM_SLOTS]
Definition vacuum.h:152
Datum * stavalues[STATISTIC_NUM_SLOTS]
Definition vacuum.h:153
float4 stadistinct
Definition vacuum.h:146
int numnumbers[STATISTIC_NUM_SLOTS]
Definition vacuum.h:150
AnalyzeAttrComputeStatsFunc compute_stats
Definition vacuum.h:135
Oid attrcollid
Definition vacuum.h:128
size_t max_bytes
Definition vacuum.h:298
int64 num_items
Definition vacuum.h:299
TransactionId FreezeLimit
Definition vacuum.h:288
TransactionId OldestXmin
Definition vacuum.h:278
TransactionId relfrozenxid
Definition vacuum.h:262
MultiXactId relminmxid
Definition vacuum.h:263
MultiXactId MultiXactCutoff
Definition vacuum.h:289
MultiXactId OldestMxact
Definition vacuum.h:279
int nworkers
Definition vacuum.h:250
int freeze_table_age
Definition vacuum.h:220
VacOptValue truncate
Definition vacuum.h:235
int freeze_min_age
Definition vacuum.h:219
int log_vacuum_min_duration
Definition vacuum.h:226
uint32 options
Definition vacuum.h:218
bool is_wraparound
Definition vacuum.h:225
int multixact_freeze_min_age
Definition vacuum.h:221
int multixact_freeze_table_age
Definition vacuum.h:223
Oid toast_parent
Definition vacuum.h:236
VacOptValue index_cleanup
Definition vacuum.h:234
int log_analyze_min_duration
Definition vacuum.h:230
double max_eager_freeze_failure_rate
Definition vacuum.h:243
void ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel)
Definition vacuum.c:163
void VacuumUpdateCosts(void)
PGDLLIMPORT int VacuumCostBalanceLocal
Definition vacuum.c:119
void parallel_vacuum_cleanup_all_indexes(ParallelVacuumState *pvs, long num_table_tuples, int num_index_scans, bool estimated_count, PVWorkerStats *wstats)
void vacuum(List *relations, const VacuumParams *params, BufferAccessStrategy bstrategy, MemoryContext vac_context, bool isTopLevel)
Definition vacuum.c:494
TidStore * parallel_vacuum_get_dead_items(ParallelVacuumState *pvs, VacDeadItemsInfo **dead_items_info_p)
void parallel_vacuum_update_shared_delay_params(void)
PGDLLIMPORT int vacuum_freeze_table_age
Definition vacuum.c:77
bool attribute_is_analyzable(Relation onerel, int attnum, Form_pg_attribute attr, int *p_attstattarget)
Definition analyze.c:1176
PGDLLIMPORT pg_atomic_uint32 * VacuumSharedCostBalance
Definition vacuum.c:117
PGDLLIMPORT int vacuum_cost_limit
Definition vacuum.c:93
bool std_typanalyze(VacAttrStats *stats)
Definition analyze.c:1949
void vac_open_indexes(Relation relation, LOCKMODE lockmode, int *nindexes, Relation **Irel)
Definition vacuum.c:2369
PGDLLIMPORT pg_atomic_uint32 * VacuumActiveNWorkers
Definition vacuum.c:118
bool vacuum_is_permitted_for_relation(Oid relid, Form_pg_class reltuple, uint32 options)
Definition vacuum.c:720
PGDLLIMPORT double vacuum_cost_delay
Definition vacuum.c:92
void parallel_vacuum_bulkdel_all_indexes(ParallelVacuumState *pvs, long num_table_tuples, int num_index_scans, PVWorkerStats *wstats)
double anl_get_next_S(double t, int n, double *stateptr)
Definition sampling.c:296
PGDLLIMPORT int vacuum_failsafe_age
Definition vacuum.c:80
IndexBulkDeleteResult * vac_cleanup_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat)
Definition vacuum.c:2679
ParallelVacuumState * parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, int nrequested_workers, int vac_work_mem, int elevel, BufferAccessStrategy bstrategy)
PGDLLIMPORT bool VacuumFailsafeActive
Definition vacuum.c:111
PGDLLIMPORT int vacuum_freeze_min_age
Definition vacuum.c:76
PGDLLIMPORT int64 parallel_vacuum_worker_delay_ns
Definition vacuum.c:96
void parallel_vacuum_reset_dead_items(ParallelVacuumState *pvs)
void vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode)
Definition vacuum.c:2412
void analyze_rel(Oid relid, RangeVar *relation, const VacuumParams *params, List *va_cols, bool in_outer_xact, BufferAccessStrategy bstrategy)
Definition analyze.c:110
Datum(* AnalyzeAttrFetchFunc)(VacAttrStatsP stats, int rownum, bool *isNull)
Definition vacuum.h:107
void vac_update_datfrozenxid(void)
Definition vacuum.c:1609
void vacuum_delay_point(bool is_analyze)
Definition vacuum.c:2433
void parallel_vacuum_propagate_shared_delay_params(void)
PGDLLIMPORT bool vacuum_truncate
Definition vacuum.c:84
bool vacuum_get_cutoffs(Relation rel, const VacuumParams *params, struct VacuumCutoffs *cutoffs)
Definition vacuum.c:1101
bool vacuum_xid_failsafe_check(const struct VacuumCutoffs *cutoffs)
Definition vacuum.c:1269
VacOptValue
Definition vacuum.h:200
@ VACOPTVALUE_AUTO
Definition vacuum.h:202
@ VACOPTVALUE_ENABLED
Definition vacuum.h:204
@ VACOPTVALUE_UNSPECIFIED
Definition vacuum.h:201
@ VACOPTVALUE_DISABLED
Definition vacuum.h:203
PGDLLIMPORT int default_statistics_target
Definition analyze.c:71
void parallel_vacuum_main(dsm_segment *seg, shm_toc *toc)
struct VacAttrStats * VacAttrStatsP
Definition vacuum.h:105
PGDLLIMPORT int vacuum_multixact_freeze_table_age
Definition vacuum.c:79
PGDLLIMPORT int vacuum_multixact_freeze_min_age
Definition vacuum.c:78
double vac_estimate_reltuples(Relation relation, BlockNumber total_pages, BlockNumber scanned_pages, double scanned_tuples)
Definition vacuum.c:1331
double anl_init_selection_state(int n)
Definition sampling.c:281
PGDLLIMPORT bool track_cost_delay_timing
Definition vacuum.c:83
void(* AnalyzeAttrComputeStatsFunc)(VacAttrStatsP stats, AnalyzeAttrFetchFunc fetchfunc, int samplerows, double totalrows)
Definition vacuum.h:110
void AutoVacuumUpdateCostLimit(void)
void parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats)
PGDLLIMPORT int vacuum_multixact_failsafe_age
Definition vacuum.c:81
Relation vacuum_open_relation(Oid relid, RangeVar *relation, uint32 options, bool verbose, LOCKMODE lmode)
Definition vacuum.c:772
void vac_update_relstats(Relation relation, BlockNumber num_pages, double num_tuples, BlockNumber num_all_visible_pages, BlockNumber num_all_frozen_pages, bool hasindex, TransactionId frozenxid, MultiXactId minmulti, bool *frozenxid_updated, bool *minmulti_updated, bool in_outer_xact)
Definition vacuum.c:1427
double anl_random_fract(void)
Definition sampling.c:266
IndexBulkDeleteResult * vac_bulkdel_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat, TidStore *dead_items, VacDeadItemsInfo *dead_items_info)
Definition vacuum.c:2658
PGDLLIMPORT double vacuum_max_eager_freeze_failure_rate
Definition vacuum.c:82