pg_ivm
pg_ivm : incremental view maintenance on PostgreSQL
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 2840 | pg_ivm
|
pg_ivm
|
1.15 |
FEAT
|
PostgreSQL
|
C
|
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
--sLd--
|
No
|
Yes
|
Yes
|
Yes
|
no
|
no
|
| Relationships | |
|---|---|
| Schemas | pg_catalog |
| See Also | age
hll
rum
pg_graphql
pg_jsonschema
jsquery
pg_hint_plan
|
PGDG RPM and PIGSTY DEB are aligned at 1.15 for PostgreSQL 14-18.
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | MIXED
|
1.15 |
18
17
16
15
14
|
pg_ivm |
- |
| RPM | PGDG
|
1.15 |
18
17
16
15
14
|
pg_ivm_$v |
- |
| DEB | PIGSTY
|
1.15 |
18
17
16
15
14
|
postgresql-$v-pg-ivm |
- |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
el8.x86_64
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
el8.aarch64
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
el9.x86_64
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
el9.aarch64
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
el10.x86_64
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
el10.aarch64
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
PGDG 1.15
|
d12.x86_64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
d12.aarch64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
d13.x86_64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
d13.aarch64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
u22.x86_64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
u22.aarch64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
u24.x86_64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
u24.aarch64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
u26.x86_64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
u26.aarch64
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
PIGSTY 1.15
|
Source
pig build pkg pg_ivm; # build debInstall
Make sure PGDG and PIGSTY repo available:
pig repo add pgsql -u # add both repo and update cacheInstall this extension with pig:
pig install pg_ivm; # install via package name, for the active PG version
pig install pg_ivm -v 18; # install for PG 18
pig install pg_ivm -v 17; # install for PG 17
pig install pg_ivm -v 16; # install for PG 16
pig install pg_ivm -v 15; # install for PG 15
pig install pg_ivm -v 14; # install for PG 14Config this extension to shared_preload_libraries:
shared_preload_libraries = 'pg_ivm';Create this extension with:
CREATE EXTENSION pg_ivm;Usage
Sources:
pg_ivm provides immediate incremental view maintenance for PostgreSQL. An Incrementally Maintainable Materialized View (IMMV) is stored as a table with triggers and metadata in the pgivm schema; base-table changes update the IMMV inside the same transaction instead of recomputing the complete query.
Enable and Create an IMMV
Load the library for every session that can modify an IMMV’s base tables. A cluster-wide setup requires a restart:
shared_preload_libraries = 'pg_ivm'session_preload_libraries = 'pg_ivm' is also supported when managed consistently for all relevant sessions.
CREATE EXTENSION pg_ivm;
SELECT pgivm.create_immv(
'account_totals',
'SELECT branch_id, count(*) AS accounts, sum(balance) AS balance
FROM accounts
GROUP BY branch_id'
);
UPDATE accounts
SET balance = balance + 100
WHERE account_id = 42;
SELECT * FROM account_totals;Manage and Inspect IMMVs
pgivm.create_immv(name, query): creates and populates an IMMV, returning its row count.pgivm.refresh_immv(name, with_data): fully rebuilds the IMMV;falsedisables maintenance until a later populated refresh.pgivm.get_immv_def(regclass): returns the stored view definition.pgivm.restore_immv(name, query, populate): version 1.15 function that reconstructs metadata, triggers, and indexes for an existing IMMV table.pgivm.get_create_immv_commands()andpgivm.get_restore_immv_commands(): emit SQL for rebuilding IMMVs or restoring their metadata.
Version 1.15 includes a helper for dump or pg_upgrade workflows:
pg_ivm_dump_metadata -d application > pg_ivm_metadata.sqlThe script emits pgivm.restore_immv() calls. Restore the table data first, then execute the saved metadata SQL so incremental maintenance resumes without recreating the tables.
Restrictions and Operational Caveats
- Supported definitions include selected joins,
DISTINCT, simple subqueries/CTEs, and built-incount,sum,avg,min, andmaxaggregates. Unsupported constructs includeHAVING, window functions,ORDER BY,LIMIT/OFFSET, set operations,DISTINCT ON, and user-defined aggregates. - Efficient maintenance depends on a suitable unique index.
create_immv()creates one automatically only when the definition supplies usable grouping, distinct, or base-table primary-key columns. - Creation and refresh take
AccessExclusiveLock. Upstream warns about consistency risks for creation underREPEATABLE READorSERIALIZABLE; useREAD COMMITTEDor refresh afterward. restore_immv()fails when the relation is already registered or its table definition does not match the supplied query.- Version 1.15 also fixes incorrect maintenance after repeated trigger-driven modifications and a v1.14 outer-join maintenance crash.