Skip to content
columnar

columnar

hydra : Hydra Columnar extension

Overview

ID Extension Package Version Category License Language
2410
columnar
hydra
1.1.2
OLAP
AGPL-3.0
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d--
No
Yes
No
Yes
no
no
Relationships
See Also
citus
citus_columnar
pg_mooncake
timescaledb
pg_analytics
pg_parquet
pg_duckdb
duckdb_fdw

conflict with citus columnar, obsolete, no longer maintained

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
1.1.2
18
17
16
15
14
hydra -
RPM
PIGSTY
1.1.2
18
17
16
15
14
hydra_$v -
DEB
PIGSTY
1.1.2
18
17
16
15
14
postgresql-$v-hydra -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
el8.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
el9.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
el9.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
el10.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
el10.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
d12.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
d12.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
d13.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
d13.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
u22.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
u22.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
u24.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
u24.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
u26.x86_64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
u26.aarch64
MISS
MISS
PIGSTY 1.1.2
PIGSTY 1.1.2
PIGSTY 1.1.2
Package Version OS ORG SIZE File URL
hydra_16 1.1.2 el8.x86_64 pigsty 143.1 KiB hydra_16-1.1.2-1PIGSTY.el8.x86_64.rpm
hydra_16 1.1.2 el8.aarch64 pigsty 136.7 KiB hydra_16-1.1.2-1PIGSTY.el8.aarch64.rpm
hydra_16 1.1.2 el9.x86_64 pigsty 116.2 KiB hydra_16-1.1.2-1PIGSTY.el9.x86_64.rpm
hydra_16 1.1.2 el9.aarch64 pigsty 112.5 KiB hydra_16-1.1.2-1PIGSTY.el9.aarch64.rpm
hydra_16 1.1.2 el10.x86_64 pigsty 118.3 KiB hydra_16-1.1.2-1PIGSTY.el10.x86_64.rpm
hydra_16 1.1.2 el10.aarch64 pigsty 113.9 KiB hydra_16-1.1.2-1PIGSTY.el10.aarch64.rpm
postgresql-16-hydra 1.1.2 d12.x86_64 pigsty 354.6 KiB postgresql-16-hydra_1.1.2-1PIGSTY~bookworm_amd64.deb
postgresql-16-hydra 1.1.2 d12.aarch64 pigsty 409.0 KiB postgresql-16-hydra_1.1.2-1PIGSTY~bookworm_arm64.deb
postgresql-16-hydra 1.1.2 d13.x86_64 pigsty 355.8 KiB postgresql-16-hydra_1.1.2-1PIGSTY~trixie_amd64.deb
postgresql-16-hydra 1.1.2 d13.aarch64 pigsty 347.6 KiB postgresql-16-hydra_1.1.2-1PIGSTY~trixie_arm64.deb
postgresql-16-hydra 1.1.2 u22.x86_64 pigsty 430.5 KiB postgresql-16-hydra_1.1.2-1PIGSTY~jammy_amd64.deb
postgresql-16-hydra 1.1.2 u22.aarch64 pigsty 425.2 KiB postgresql-16-hydra_1.1.2-1PIGSTY~jammy_arm64.deb
postgresql-16-hydra 1.1.2 u24.x86_64 pigsty 359.9 KiB postgresql-16-hydra_1.1.2-1PIGSTY~noble_amd64.deb
postgresql-16-hydra 1.1.2 u24.aarch64 pigsty 363.6 KiB postgresql-16-hydra_1.1.2-1PIGSTY~noble_arm64.deb
postgresql-16-hydra 1.1.2 u26.x86_64 pigsty 358.0 KiB postgresql-16-hydra_1.1.2-1PIGSTY~resolute_amd64.deb
postgresql-16-hydra 1.1.2 u26.aarch64 pigsty 355.8 KiB postgresql-16-hydra_1.1.2-1PIGSTY~resolute_arm64.deb

Source

pig build pkg hydra;		# 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 hydra;		# install via package name, for the active PG version
pig install columnar;		# install by extension name, for the current active PG version

pig install columnar -v 16;   # install for PG 16
pig install columnar -v 15;   # install for PG 15
pig install columnar -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION columnar;

Usage

Sources:

Warning

columnar is the PostgreSQL extension name, while Pigsty packages it as hydra. Pigsty metadata marks this extension as obsolete and no longer maintained; local packages are retained for PostgreSQL 14-16 only. Prefer newer actively maintained analytics extensions for new deployments.

Hydra Columnar is a PostgreSQL table access method for column-oriented storage. It stores selected tables in a columnar format to reduce I/O for analytical scans, compression-heavy datasets, projections over a subset of columns, and aggregate queries. It originated from Citus Columnar and is exposed through CREATE EXTENSION columnar.

Create Columnar Tables

CREATE EXTENSION IF NOT EXISTS columnar;

CREATE TABLE events_columnar (
  event_id     bigint,
  account_id   bigint,
  event_time   timestamptz,
  event_type   text,
  amount       numeric
) USING columnar;

INSERT INTO events_columnar
SELECT
  g,
  g % 10000,
  now() - (g || ' seconds')::interval,
  CASE WHEN g % 10 = 0 THEN 'purchase' ELSE 'view' END,
  (g % 1000)::numeric / 10
FROM generate_series(1, 1000000) AS g;

SELECT event_type, count(*), sum(amount)
FROM events_columnar
WHERE event_time >= now() - interval '1 day'
GROUP BY event_type;

Use USING columnar when creating a table or materialized view. Reads and bulk inserts use normal PostgreSQL SQL, but the storage format is optimized for large analytical scans rather than high-churn OLTP tables.

Table Options

SELECT columnar.alter_columnar_table_set(
  'events_columnar'::regclass,
  compression           => 'zstd',
  compression_level     => 3,
  stripe_row_limit      => 150000,
  chunk_group_row_limit => 10000
);

SELECT * FROM columnar.options;

SELECT columnar.alter_columnar_table_reset(
  'events_columnar'::regclass,
  compression => true,
  stripe_row_limit => true
);

Available table options include compression, compression_level, stripe_row_limit, and chunk_group_row_limit. Compression choices depend on build support, but documented values include none, pglz, zstd, lz4, and lz4hc. Option changes apply to newly inserted data; existing stripes are not automatically rewritten.

You can also set defaults for newly created columnar tables with GUCs:

SET columnar.compression = 'zstd';
SET columnar.compression_level = 3;
SET columnar.stripe_row_limit = 150000;
SET columnar.chunk_group_row_limit = 10000;

These GUCs affect newly created tables, not new stripes on an already existing table.

Convert Existing Tables

CREATE TABLE events_heap (
  event_id bigint,
  payload  jsonb
);

INSERT INTO events_heap
SELECT g, jsonb_build_object('kind', 'view', 'seq', g)
FROM generate_series(1, 10000) AS g;

SELECT columnar.alter_table_set_access_method('events_heap', 'columnar');
SELECT columnar.alter_table_set_access_method('events_heap', 'heap');

columnar.alter_table_set_access_method(table, method) rewrites a heap table as columnar storage or a columnar table back to heap storage. Review foreign keys, identity columns, row-level security, triggers, indexes, constraints, inheritance, and storage options before conversion; the helper rejects or skips features it cannot safely recreate.

Partitioning

CREATE TABLE measurements (
  ts timestamptz,
  device_id bigint,
  value double precision
) PARTITION BY RANGE (ts);

CREATE TABLE measurements_2024 PARTITION OF measurements
  FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
  USING columnar;

CREATE TABLE measurements_hot PARTITION OF measurements
  FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');

Partitioned tables can mix row and columnar partitions. Operations that target only row partitions can use row-table behavior, while operations that touch columnar partitions must respect columnar limitations. This is useful for keeping recent mutable data in heap partitions and older analytical history in columnar partitions.

Maintenance and Introspection

VACUUM VERBOSE events_columnar;
VACUUM FULL events_columnar;

SELECT * FROM columnar.stats('events_columnar'::regclass);
SELECT columnar.vacuum('events_columnar'::regclass);
SELECT columnar.vacuum_full('public', 0.1, 25);

VACUUM VERBOSE reports columnar storage statistics such as file size, compression rate, row count, stripe count, and chunk count. columnar.stats() exposes stripe-level metadata. columnar.vacuum() and columnar.vacuum_full() compact columnar storage incrementally; ordinary VACUUM is metadata-oriented and cheaper than a full rewrite.

Caveats

  • This extension is obsolete in Pigsty metadata and conflicts with citus/citus_columnar style columnar storage. Avoid installing conflicting columnar table access methods in the same PostgreSQL major unless you have tested the exact combination.
  • Pigsty packages hydra/columnar for PostgreSQL 14-16; PostgreSQL 17 and 18 are marked unsupported locally.
  • Hydra 1.1.x added update/delete and upsert improvements, but the project itself still describes columnar storage as unsuitable for frequent large updates, small transactions, and OLTP-style single-row workloads.
  • Unsupported or limited areas include logical decoding, unlogged columnar tables, serializable isolation, some scan types, and many non-btree/non-hash indexes. Check constraints and index-backed constraints carefully before relying on them.
  • The columnar schema contains internal metadata tables such as columnar.options, columnar.stripe, columnar.chunk_group, and columnar.chunk. Query public views/functions for inspection, but do not mutate metadata tables directly.
Last updated on