mirror of
https://github.com/postgres/postgres.git
synced 2025-08-31 17:02:12 +03:00
Add a materialized view relations.
A materialized view has a rule just like a view and a heap and other physical properties like a table. The rule is only used to populate the table, references in queries refer to the materialized data. This is a minimal implementation, but should still be useful in many cases. Currently data is only populated "on demand" by the CREATE MATERIALIZED VIEW and REFRESH MATERIALIZED VIEW statements. It is expected that future releases will add incremental updates with various timings, and that a more refined concept of defining what is "fresh" data will be developed. At some point it may even be possible to have queries use a materialized in place of references to underlying tables, but that requires the other above-mentioned features to be working first. Much of the documentation work by Robert Haas. Review by Noah Misch, Thom Brown, Robert Haas, Marko Tiikkaja Security review by KaiGai Kohei, with a decision on how best to implement sepgsql still pending.
This commit is contained in:
@@ -1990,22 +1990,17 @@ do_autovacuum(void)
|
||||
* Scan pg_class to determine which tables to vacuum.
|
||||
*
|
||||
* We do this in two passes: on the first one we collect the list of plain
|
||||
* relations, and on the second one we collect TOAST tables. The reason
|
||||
* for doing the second pass is that during it we want to use the main
|
||||
* relation's pg_class.reloptions entry if the TOAST table does not have
|
||||
* any, and we cannot obtain it unless we know beforehand what's the main
|
||||
* table OID.
|
||||
* relations and materialized views, and on the second one we collect
|
||||
* TOAST tables. The reason for doing the second pass is that during it we
|
||||
* want to use the main relation's pg_class.reloptions entry if the TOAST
|
||||
* table does not have any, and we cannot obtain it unless we know
|
||||
* beforehand what's the main table OID.
|
||||
*
|
||||
* We need to check TOAST tables separately because in cases with short,
|
||||
* wide tables there might be proportionally much more activity in the
|
||||
* TOAST table than in its parent.
|
||||
*/
|
||||
ScanKeyInit(&key,
|
||||
Anum_pg_class_relkind,
|
||||
BTEqualStrategyNumber, F_CHAREQ,
|
||||
CharGetDatum(RELKIND_RELATION));
|
||||
|
||||
relScan = heap_beginscan(classRel, SnapshotNow, 1, &key);
|
||||
relScan = heap_beginscan(classRel, SnapshotNow, 0, NULL);
|
||||
|
||||
/*
|
||||
* On the first pass, we collect main tables to vacuum, and also the main
|
||||
@@ -2021,6 +2016,10 @@ do_autovacuum(void)
|
||||
bool doanalyze;
|
||||
bool wraparound;
|
||||
|
||||
if (classForm->relkind != RELKIND_RELATION &&
|
||||
classForm->relkind != RELKIND_MATVIEW)
|
||||
continue;
|
||||
|
||||
relid = HeapTupleGetOid(tuple);
|
||||
|
||||
/* Fetch reloptions and the pgstat entry for this table */
|
||||
@@ -2406,6 +2405,7 @@ extract_autovac_opts(HeapTuple tup, TupleDesc pg_class_desc)
|
||||
AutoVacOpts *av;
|
||||
|
||||
Assert(((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_RELATION ||
|
||||
((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_MATVIEW ||
|
||||
((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_TOASTVALUE);
|
||||
|
||||
relopts = extractRelOptions(tup, pg_class_desc, InvalidOid);
|
||||
|
@@ -1599,6 +1599,7 @@ pgstat_initstats(Relation rel)
|
||||
|
||||
/* We only count stats for things that have storage */
|
||||
if (!(relkind == RELKIND_RELATION ||
|
||||
relkind == RELKIND_MATVIEW ||
|
||||
relkind == RELKIND_INDEX ||
|
||||
relkind == RELKIND_TOASTVALUE ||
|
||||
relkind == RELKIND_SEQUENCE))
|
||||
|
Reference in New Issue
Block a user