本文是 PostgreSQL overview 的 implementation-layer deep article。Overview 已說明 PG 在 OLTP 譜系的定位、本文聚焦 extension ecosystem — PG 結構性產品線擴張的機制。


Extension 不只是 plugin、是產品線擴張

PG extension 機制讓 第三方加新 type / function / operator / index access method / planner hook、深度整合到 PG core。對比其他 DB 的 plugin model(MySQL plugin / MongoDB plugin)、PG extension 是 更深的 SPI

結果:

  • pgvector → PG 變 vector similarity search DB(取代 Pinecone / Weaviate)
  • TimescaleDB → PG 變 time-series DB(取代 InfluxDB)
  • Citus → PG 變 sharded cluster
  • PostGIS → PG 變 GIS DB
  • pg_cron → PG 變 scheduled job runner
  • pgvectorscale → 大規模 vector index

vendor lock-in 敏感 / 想統一 stack 的 org、PG extension 提供 用 PG 取代多個 specialized DB 的可能。

統一 stack 的代價:PG 主庫 ops 風險集中(一個 PG 掛 = vector / time-series / GIS / cron 全掛)、extension 跟 PG version 對齊矩陣多一道升級顧慮、規模上限通常比專業 DB 低(pgvector 100M+ vs Pinecone 10B+ / TimescaleDB 100K rows/s vs InfluxDB 500K+)。決策框架:中小規模 + 已用 PG + 不想多管系統 → extension;大規模 + 純該 workload + 有專業 team → specialized DB。

Extension Lifecycle

 1-- 看可用 extension
 2SELECT * FROM pg_available_extensions;
 3
 4-- 安裝(在 OS 層、要有對應 package)
 5-- apt install postgresql-14-pg-stat-statements
 6
 7-- Enable in DB
 8CREATE EXTENSION pg_stat_statements;
 9
10-- 確認
11SELECT * FROM pg_extension;
12
13-- 升級 extension
14ALTER EXTENSION pg_stat_statements UPDATE;
15
16-- 移除
17DROP EXTENSION pg_stat_statements;

每個 extension 有:

  • Version — 跟 PG version 綁定(如 pg_stat_statements 14 / 15 / 16)
  • Schema — 安裝到 public 或專屬 schema
  • Dependencies — 部分 extension 依賴其他(如 PostGIS 依賴 pg_trgm)
  • Trusted vs untrusted — trusted 可以 non-superuser 安裝(PG 13+)

6 個 Production-Critical Extension

1. pg_stat_statements — Query stats(必裝)

任何 production PG cluster 都該裝:

1# postgresql.conf
2shared_preload_libraries = 'pg_stat_statements'
3pg_stat_statements.max = 5000
4pg_stat_statements.track = all
1CREATE EXTENSION pg_stat_statements;
2
3-- Top 10 query by total time
4SELECT query, calls, total_exec_time, mean_exec_time, rows
5FROM pg_stat_statements
6ORDER BY total_exec_time DESC LIMIT 10;

對應 MySQL events_statements_summary_by_digest。詳見 Query Optimization

2. pg_partman — 自動 partition lifecycle

PG declarative partitioning 需要 手動建 / drop partition。pg_partman 自動化:

 1CREATE EXTENSION pg_partman SCHEMA partman;
 2
 3-- 設 events 表自動 monthly partition
 4SELECT partman.create_parent(
 5    p_parent_table => 'public.events',
 6    p_control => 'created_at',
 7    p_type => 'range',
 8    p_interval => '1 month',
 9    p_premake => 6  -- 預先建 6 個未來 partition
10);
11
12-- 跑 maintenance(建未來 partition + drop 老 partition)
13SELECT partman.run_maintenance(p_analyze => false);
14-- 預設用 pg_cron 排程

time-series partition workload 必裝。詳見 Declarative Partitioning

3. pg_repack — Online table rewrite

詳見 Online Schema Change

LLM embedding / semantic search 場景必裝:

 1CREATE EXTENSION vector;
 2
 3CREATE TABLE documents (
 4    id SERIAL PRIMARY KEY,
 5    content TEXT,
 6    embedding VECTOR(1536)  -- OpenAI text-embedding-3-small 1536-dim
 7);
 8
 9-- HNSW index(pgvector 0.5+)
10CREATE INDEX ON documents USING HNSW (embedding vector_cosine_ops);
11
12-- 找最相似的 5 個
13SELECT * FROM documents
14ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
15LIMIT 5;

中小規模 RAG / semantic search workload、pgvector 在 PG 內跑、不必跨 Pinecone / Weaviate / Qdrant 等獨立服務。

超大規模 vector workload(> 1 億 vector)考慮 pgvectorscale(pgvector 的 streaming variant)或專業 vector DB。

5. TimescaleDB — Time-series 擴展

把 PG 變 time-series DB:

 1CREATE EXTENSION timescaledb;
 2
 3CREATE TABLE metrics (
 4    time TIMESTAMPTZ NOT NULL,
 5    device_id INT,
 6    value DOUBLE PRECISION
 7);
 8
 9-- 轉成 hypertable(auto-partition by time)
10SELECT create_hypertable('metrics', 'time');
11
12-- Continuous aggregate(materialized view 自動 refresh)
13CREATE MATERIALIZED VIEW metrics_5min
14WITH (timescaledb.continuous) AS
15SELECT time_bucket('5 minutes', time) AS bucket,
16       device_id, avg(value)
17FROM metrics
18GROUP BY bucket, device_id;

對 IoT / monitoring / financial tick data 場景、TimescaleDB 比純 PG 寫吞吐高 10x+。

6. PostGIS — GIS extension

地理 / 空間 query 業界標準:

 1CREATE EXTENSION postgis;
 2
 3CREATE TABLE stores (
 4    id SERIAL PRIMARY KEY,
 5    name TEXT,
 6    location GEOGRAPHY(POINT, 4326)
 7);
 8
 9CREATE INDEX ON stores USING GIST (location);
10
11-- 找 1 km 內的 store
12SELECT * FROM stores
13WHERE ST_DWithin(location, ST_MakePoint(121.5, 25.05)::geography, 1000);

PostGIS 是 GIS workload 業界標準、其他 DB GIS 能力都對標 PostGIS。

其他常用 extension

除 6 個 production-critical 之外、以下是 特定場景常用 的 extension — 分四類:排程跟 utility(pg_cron / pg_trgm / uuid-ossp)、type 擴展(hstore / citext / pgcrypto)、跨 DB 整合(postgres_fdw / mysql_fdw)、observability / debug 工具(pg_buffercache / pg_visibility / auto_explain):

Extension用途
pg_cron排程 SQL job(不必外部 cron)
pg_trgmFuzzy string match / similarity
uuid-osspUUID 產生
hstoreKey-value pair type
citextCase-insensitive text type
pgcrypto加密 / hash function
postgres_fdwPG → PG foreign table
mysql_fdwPG → MySQL foreign table
pg_buffercacheBuffer pool 內容檢視
pg_visibilityVisibility map 檢視(debug bloat)
auto_explainSlow query 自動 log plan
wal2jsonLogical decoding output 為 JSON
CitusDistributed PG
pgvectorVector similarity
pglogicalLogical replication(功能比 native 強)
pg_squeezepg_repack 替代

實務組合:observability 三件套(pg_stat_statements + auto_explain + pg_buffercache)幾乎是 production 標配;FDW 是「跨 DB query」的 escape hatch、但 cross-DB query 效能差、適合 reporting 不適合 OLTP。

5 個 Production 踩雷

1. Extension version 跟 PG version 對齊

PG cluster 升 14 → 15 後、extension(pg_stat_statements / pg_partman / pgvector 等)必須有對應 15 版本。早期升級 / niche extension 可能還沒釋出。

修法:

  • 升 PG cluster 前 先確認所有 extension 都有對應 PG version 釋出版本
  • 升完 PG cluster 立即跑 ALTER EXTENSION xxx UPDATE
  • Upgrade runbook 紀錄每個 extension 的版本兼容狀態

2. Managed PG 限制 extension 列表

AWS RDS / Aurora PG / Cloud SQL / Azure DB for PostgreSQL 各自有 支援 extension 白名單

  • 不在白名單的 extension 不能 install
  • 部分 extension 限定特定 PG version
  • Untrusted extension 通常不允許

常見 managed 不支援 的 extension:

  • pg_repack(Aurora 有限支援、RDS 部分 version 支援)
  • pglogical(部分 cloud 不支援)
  • pg_cron(cloud 通常用 managed scheduler 取代)
  • Custom extension(自寫 .so)

修法:

  • 評估 managed PG 之前、先查 vendor 支援 extension 列表
  • Self-hosted vs managed 的 跨雲 portability 議題:extension 是 lock-in source
  • 如果 application 強依賴某 extension(如 PostGIS),確認 cloud 支援

3. Extension upgrade order

pg_upgrade 升 PG major version 後、extension 也要升。順序:

  1. pg_upgrade PG binary + cluster
  2. 對每個 DB 跑 ALTER EXTENSION xxx UPDATE
  3. 部分 extension(如 PostGIS)需要 特殊升級程序SELECT postgis_extensions_upgrade()

修法:

  • 升 PG 後 先測 staging cluster 確認 extension upgrade 流程
  • PostGIS / TimescaleDB / Citus 有自己 upgrade 程序、必須遵循 vendor doc
  • 升完跑 \dx 看每個 extension 版本

4. shared_preload_libraries 衝突

部分 extension(pg_stat_statements / auto_explain / TimescaleDB / Citus / pg_cron)必須在 shared_preload_libraries 加進去、需要 重啟 PG

衝突情境:

  • pg_partman + TimescaleDB 都用 background worker、worker 上限不夠
  • max_worker_processes 預設 8、不夠時某些 extension 起不起來

修法:

  • 列出所有 shared_preload extension、確認 order(部分有 dependency)
  • 提高 max_worker_processes = 16 / max_parallel_workers = 8
  • 重啟 PG 才生效、計入 maintenance window

5. Extension 跟 logical replication 互動

Logical replication(pglogical / native)不自動 replicate extension state(function / type definition)。Subscriber 沒裝對應 extension、replicate event 失敗。

修法:

  • Subscriber 必須 先安裝 publisher 用的 extension
  • Extension 版本 publisher / subscriber 對齊
  • 對 extension-heavy schema、考慮用 streaming replication(physical)而非 logical

Cloud Vendor 對 Extension 的支援

Vendor常見 extension 支援限制
AWS RDS PostgreSQLpg_stat_statements / pg_partman / pgvector / pg_repack部分 version 限制 / 不能 install custom
AWS Aurora PostgreSQL同 RDS、加 Aurora-specificpg_repack 限版本
GCP Cloud SQL標準 extension 廣支援pg_cron / pgvector OK
Azure DB for PostgreSQL廣泛支援 + Azure 整合Citus(managed 即 Cosmos DB for PG)
Self-hosted全部自己維護

extension-heavy application、self-hosted PG 仍是必要選擇。Managed PG 適合 標準 extension workload。

何時用 PG extension 取代專業 DB

場景用 extension 還是專業 DB
< 100M vector + RAG / semantic searchpgvector(單一 stack 省 ops)
大規模 vector search > 10M with high QPS專業 vector DB(Pinecone / Qdrant)
Time-series < 100 TBTimescaleDB
Time-series > 100 TB + high cardinality專業 TS DB(InfluxDB / VictoriaMetrics)
GISPostGIS(業界標準)
Sharded < 10 TB + multi-tenantCitus
Sharded > 100 TBdistributed SQL(CockroachDB / TiDB)
Scheduled jobpg_cron(簡單)/ Airflow(複雜)

對中小規模、PG + extension 是 簡化 stack 的有效路徑。規模超過時、專業 DB 仍是首選。

跟其他模組整合

相關連結