这是《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 扩展治理
- 只安装可信扩展;
- 固定扩展版本;
- 评估备份兼容性;
- 确认升级路径;
- 观察内核崩溃风险;
- 记录扩展依赖;
- 云环境确认支持情况。
本章小结
扩展生态让 PostgreSQL 覆盖 GIS、向量、时序、模糊检索和数据集成等场景。但扩展会改变运维边界,引入前要验证版本、性能、稳定性和备份恢复。
思考题
- pg_stat_statements 能解决什么问题?
- pg_trgm 适合哪些模糊查询?
- FDW 查询为什么必须看执行计划?
- pgvector 的索引方式有什么取舍?
- 扩展升级要注意什么?