PostgreSQLNotes

第 24 章:扩展生态

zjc 于 2026-01-24 发布

这是《PostgreSQL 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 PostgreSQL 的扩展能力是它成为“数据库平台”的重要原因。扩展可以增加索引、类型、函数、外部表和调度能力。

24.1 扩展机制

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

查看:

SELECT extname, extversion
FROM pg_extension;

可用扩展:

SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name IN ('postgis', 'pgvector', 'timescaledb');

24.2 常用扩展

扩展 用途
pg_stat_statements SQL 性能统计
postgis GIS
pgvector 向量检索
timescaledb 时序
pg_trgm 相似度和模糊匹配
pgcrypto 加密函数
hstore 键值类型
postgres_fdw PostgreSQL 外部表
pg_partman 分区管理
pg_repack 在线重整

24.3 pg_stat_statements

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

查询:

SELECT
    calls,
    round(total_exec_time::numeric, 2) AS total_ms,
    round(mean_exec_time::numeric, 2) AS mean_ms,
    rows,
    shared_blks_read,
    query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;

重置:

SELECT pg_stat_statements_reset();

24.4 pg_trgm

CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE INDEX idx_products_name_trgm
ON products USING GIN (name gin_trgm_ops);

相似查询:

SELECT name, similarity(name, 'postgres') AS score
FROM products
WHERE name % 'postgres'
ORDER BY score DESC;

适合模糊搜索,复杂中文语义仍需专门分词或搜索引擎。

24.5 FDW

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

CREATE SERVER remote_pg
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'remote.internal', dbname 'shop', port '5432');

映射用户和表:

CREATE USER MAPPING FOR app_user
SERVER remote_pg
OPTIONS (user 'reader', password 'strong-password');

IMPORT FOREIGN SCHEMA public
FROM SERVER remote_pg
INTO remote;

FDW 下推能力与版本和 SQL 形态相关,必须检查执行计划。

24.6 pgvector

CREATE EXTENSION IF NOT EXISTS vector;

CREATE TABLE docs (
    id bigint PRIMARY KEY,
    content text,
    embedding vector(1536)
);

索引:

CREATE INDEX idx_docs_embedding
ON docs USING hnsw (embedding vector_cosine_ops);

查询:

SELECT id, content
FROM docs
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 10;

24.7 扩展治理

  1. 只安装可信扩展;
  2. 固定扩展版本;
  3. 评估备份兼容性;
  4. 确认升级路径;
  5. 观察内核崩溃风险;
  6. 记录扩展依赖;
  7. 云环境确认支持情况。

本章小结

扩展生态让 PostgreSQL 覆盖 GIS、向量、时序、模糊检索和数据集成等场景。但扩展会改变运维边界,引入前要验证版本、性能、稳定性和备份恢复。

思考题

  1. pg_stat_statements 能解决什么问题?
  2. pg_trgm 适合哪些模糊查询?
  3. FDW 查询为什么必须看执行计划?
  4. pgvector 的索引方式有什么取舍?
  5. 扩展升级要注意什么?