pg_ttl_index

pg_ttl_index

pg_ttl_index : Automatic data expiration with TTL indexes

Overview

ID Extension Package Version Category License Language
2740
pg_ttl_index
pg_ttl_index
2.0.0
FEAT
PostgreSQL
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--sLd-r
No
Yes
Yes
Yes
yes
no
Relationships
See Also
temporal_tables
periods
hll
rum
pg_partman
pg_cron
pg_task
timescaledb

pg 14 breaks

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
2.0.0
18
17
16
15
14
pg_ttl_index -
RPM
PIGSTY
2.0.0
18
17
16
15
14
pg_ttl_index_$v -
DEB
PIGSTY
2.0.0
18
17
16
15
14
postgresql-$v-ttl-index -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
el8.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
el9.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
el9.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
el10.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
el10.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
d12.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
d12.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
d13.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
d13.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
u22.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
u22.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
u24.x86_64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
u24.aarch64
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
PIGSTY 2.0.0
MISS
Package Version OS ORG SIZE File URL
pg_ttl_index_18 2.0.0 el8.x86_64 pigsty 21.6 KiB pg_ttl_index_18-2.0.0-1PIGSTY.el8.x86_64.rpm
pg_ttl_index_18 2.0.0 el8.aarch64 pigsty 21.8 KiB pg_ttl_index_18-2.0.0-1PIGSTY.el8.aarch64.rpm
pg_ttl_index_18 2.0.0 el9.x86_64 pigsty 21.1 KiB pg_ttl_index_18-2.0.0-1PIGSTY.el9.x86_64.rpm
pg_ttl_index_18 2.0.0 el9.aarch64 pigsty 21.2 KiB pg_ttl_index_18-2.0.0-1PIGSTY.el9.aarch64.rpm
pg_ttl_index_18 2.0.0 el10.x86_64 pigsty 21.2 KiB pg_ttl_index_18-2.0.0-1PIGSTY.el10.x86_64.rpm
pg_ttl_index_18 2.0.0 el10.aarch64 pigsty 21.4 KiB pg_ttl_index_18-2.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-18-ttl-index 2.0.0 d12.x86_64 pigsty 12.0 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~bookworm_amd64.deb
postgresql-18-ttl-index 2.0.0 d12.aarch64 pigsty 11.9 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~bookworm_arm64.deb
postgresql-18-ttl-index 2.0.0 d13.x86_64 pigsty 12.0 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~trixie_amd64.deb
postgresql-18-ttl-index 2.0.0 d13.aarch64 pigsty 12.0 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~trixie_arm64.deb
postgresql-18-ttl-index 2.0.0 u22.x86_64 pigsty 12.0 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~jammy_amd64.deb
postgresql-18-ttl-index 2.0.0 u22.aarch64 pigsty 11.8 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~jammy_arm64.deb
postgresql-18-ttl-index 2.0.0 u24.x86_64 pigsty 11.9 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~noble_amd64.deb
postgresql-18-ttl-index 2.0.0 u24.aarch64 pigsty 11.7 KiB postgresql-18-ttl-index_2.0.0-2PIGSTY~noble_arm64.deb
Package Version OS ORG SIZE File URL
pg_ttl_index_17 2.0.0 el8.x86_64 pigsty 21.6 KiB pg_ttl_index_17-2.0.0-1PIGSTY.el8.x86_64.rpm
pg_ttl_index_17 2.0.0 el8.aarch64 pigsty 21.8 KiB pg_ttl_index_17-2.0.0-1PIGSTY.el8.aarch64.rpm
pg_ttl_index_17 2.0.0 el9.x86_64 pigsty 21.1 KiB pg_ttl_index_17-2.0.0-1PIGSTY.el9.x86_64.rpm
pg_ttl_index_17 2.0.0 el9.aarch64 pigsty 21.2 KiB pg_ttl_index_17-2.0.0-1PIGSTY.el9.aarch64.rpm
pg_ttl_index_17 2.0.0 el10.x86_64 pigsty 21.2 KiB pg_ttl_index_17-2.0.0-1PIGSTY.el10.x86_64.rpm
pg_ttl_index_17 2.0.0 el10.aarch64 pigsty 21.4 KiB pg_ttl_index_17-2.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-17-ttl-index 2.0.0 d12.x86_64 pigsty 12.0 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~bookworm_amd64.deb
postgresql-17-ttl-index 2.0.0 d12.aarch64 pigsty 11.9 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~bookworm_arm64.deb
postgresql-17-ttl-index 2.0.0 d13.x86_64 pigsty 12.0 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~trixie_amd64.deb
postgresql-17-ttl-index 2.0.0 d13.aarch64 pigsty 12.0 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~trixie_arm64.deb
postgresql-17-ttl-index 2.0.0 u22.x86_64 pigsty 11.9 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~jammy_amd64.deb
postgresql-17-ttl-index 2.0.0 u22.aarch64 pigsty 11.8 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~jammy_arm64.deb
postgresql-17-ttl-index 2.0.0 u24.x86_64 pigsty 11.9 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~noble_amd64.deb
postgresql-17-ttl-index 2.0.0 u24.aarch64 pigsty 11.7 KiB postgresql-17-ttl-index_2.0.0-2PIGSTY~noble_arm64.deb
Package Version OS ORG SIZE File URL
pg_ttl_index_16 2.0.0 el8.x86_64 pigsty 21.6 KiB pg_ttl_index_16-2.0.0-1PIGSTY.el8.x86_64.rpm
pg_ttl_index_16 2.0.0 el8.aarch64 pigsty 21.8 KiB pg_ttl_index_16-2.0.0-1PIGSTY.el8.aarch64.rpm
pg_ttl_index_16 2.0.0 el9.x86_64 pigsty 21.2 KiB pg_ttl_index_16-2.0.0-1PIGSTY.el9.x86_64.rpm
pg_ttl_index_16 2.0.0 el9.aarch64 pigsty 21.2 KiB pg_ttl_index_16-2.0.0-1PIGSTY.el9.aarch64.rpm
pg_ttl_index_16 2.0.0 el10.x86_64 pigsty 21.2 KiB pg_ttl_index_16-2.0.0-1PIGSTY.el10.x86_64.rpm
pg_ttl_index_16 2.0.0 el10.aarch64 pigsty 21.4 KiB pg_ttl_index_16-2.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-16-ttl-index 2.0.0 d12.x86_64 pigsty 12.0 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~bookworm_amd64.deb
postgresql-16-ttl-index 2.0.0 d12.aarch64 pigsty 11.9 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~bookworm_arm64.deb
postgresql-16-ttl-index 2.0.0 d13.x86_64 pigsty 12.0 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~trixie_amd64.deb
postgresql-16-ttl-index 2.0.0 d13.aarch64 pigsty 12.0 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~trixie_arm64.deb
postgresql-16-ttl-index 2.0.0 u22.x86_64 pigsty 11.9 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~jammy_amd64.deb
postgresql-16-ttl-index 2.0.0 u22.aarch64 pigsty 11.8 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~jammy_arm64.deb
postgresql-16-ttl-index 2.0.0 u24.x86_64 pigsty 11.9 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~noble_amd64.deb
postgresql-16-ttl-index 2.0.0 u24.aarch64 pigsty 11.7 KiB postgresql-16-ttl-index_2.0.0-2PIGSTY~noble_arm64.deb
Package Version OS ORG SIZE File URL
pg_ttl_index_15 2.0.0 el8.x86_64 pigsty 21.7 KiB pg_ttl_index_15-2.0.0-1PIGSTY.el8.x86_64.rpm
pg_ttl_index_15 2.0.0 el8.aarch64 pigsty 22.0 KiB pg_ttl_index_15-2.0.0-1PIGSTY.el8.aarch64.rpm
pg_ttl_index_15 2.0.0 el9.x86_64 pigsty 21.6 KiB pg_ttl_index_15-2.0.0-1PIGSTY.el9.x86_64.rpm
pg_ttl_index_15 2.0.0 el9.aarch64 pigsty 21.5 KiB pg_ttl_index_15-2.0.0-1PIGSTY.el9.aarch64.rpm
pg_ttl_index_15 2.0.0 el10.x86_64 pigsty 21.6 KiB pg_ttl_index_15-2.0.0-1PIGSTY.el10.x86_64.rpm
pg_ttl_index_15 2.0.0 el10.aarch64 pigsty 21.7 KiB pg_ttl_index_15-2.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-15-ttl-index 2.0.0 d12.x86_64 pigsty 12.1 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~bookworm_amd64.deb
postgresql-15-ttl-index 2.0.0 d12.aarch64 pigsty 12.1 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~bookworm_arm64.deb
postgresql-15-ttl-index 2.0.0 d13.x86_64 pigsty 12.1 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~trixie_amd64.deb
postgresql-15-ttl-index 2.0.0 d13.aarch64 pigsty 12.1 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~trixie_arm64.deb
postgresql-15-ttl-index 2.0.0 u22.x86_64 pigsty 12.3 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~jammy_amd64.deb
postgresql-15-ttl-index 2.0.0 u22.aarch64 pigsty 12.1 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~jammy_arm64.deb
postgresql-15-ttl-index 2.0.0 u24.x86_64 pigsty 12.3 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~noble_amd64.deb
postgresql-15-ttl-index 2.0.0 u24.aarch64 pigsty 12.1 KiB postgresql-15-ttl-index_2.0.0-2PIGSTY~noble_arm64.deb
Package Version OS ORG SIZE File URL
pg_ttl_index_14 2.0.0 el8.x86_64 pigsty 21.7 KiB pg_ttl_index_14-2.0.0-1PIGSTY.el8.x86_64.rpm
pg_ttl_index_14 2.0.0 el8.aarch64 pigsty 22.0 KiB pg_ttl_index_14-2.0.0-1PIGSTY.el8.aarch64.rpm
pg_ttl_index_14 2.0.0 el9.x86_64 pigsty 21.6 KiB pg_ttl_index_14-2.0.0-1PIGSTY.el9.x86_64.rpm
pg_ttl_index_14 2.0.0 el9.aarch64 pigsty 21.5 KiB pg_ttl_index_14-2.0.0-1PIGSTY.el9.aarch64.rpm

Source

pig build pkg pg_ttl_index;		# build rpm/deb

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_ttl_index;		# install via package name, for the active PG version

pig install pg_ttl_index -v 18;   # install for PG 18
pig install pg_ttl_index -v 17;   # install for PG 17
pig install pg_ttl_index -v 16;   # install for PG 16
pig install pg_ttl_index -v 15;   # install for PG 15

Config this extension to shared_preload_libraries:

shared_preload_libraries = 'pg_ttl_index';

Create this extension with:

CREATE EXTENSION pg_ttl_index;

Usage

pg_ttl_index: Automatic data expiration with TTL indexes

pg_ttl_index provides automatic data expiration by associating a TTL (time-to-live) with a timestamp column. A background worker periodically deletes rows whose timestamp exceeds the configured expiration interval.

Quick Start

-- Start the background worker
SELECT ttl_start_worker();

-- Create a table with a timestamp column
CREATE TABLE user_sessions (
    id SERIAL PRIMARY KEY,
    user_id INTEGER,
    session_data JSONB,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Expire rows after 1 hour (3600 seconds)
SELECT ttl_create_index('user_sessions', 'created_at', 3600);

Functions

Function Description
ttl_start_worker() Start the background worker for automatic cleanup
ttl_worker_status() Check if the worker is running
ttl_runner() Manually trigger cleanup
ttl_create_index(table, column, expire_seconds [, batch_size]) Configure TTL expiration
ttl_drop_index(table, column) Remove TTL configuration
ttl_summary() List all TTL indexes with stats

Examples

Session management with 24-hour expiry:

SELECT ttl_create_index('sessions', 'created_at', 86400, 5000);

Log retention for 7 days:

SELECT ttl_create_index('app_logs', 'logged_at', 604800);

Cache entries with custom expiry column (0 means the column itself holds the absolute expiry time):

SELECT ttl_create_index('cache_entries', 'expires_at', 0);

Monitoring

SELECT * FROM ttl_summary();

Pause cleanup for a specific table:

UPDATE ttl_index_table SET active = false WHERE table_name = 'user_sessions';

Configuration

Parameter Description Default
pg_ttl_index.naptime Cleanup interval in seconds 60
pg_ttl_index.enabled Enable/disable worker globally on
ALTER SYSTEM SET pg_ttl_index.naptime = 30;
SELECT pg_reload_conf();
Last updated on