# PostgreSQL 特性详解

> PostgreSQL 被称作「最先进的开源数据库」，先进在哪？本专栏挑出 19 个真正拉开差距的特性，每个都配 PG 18.4 上的真实 SQL 与输出，横向对比 MySQL / Oracle / SQL Server，并结合实现原理讲透。

- 作者：David（道雾轩）
- 最后更新：2026-08-03
- 原文：https://daiw.org/manual/postgresql
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 序 · 那些「知道就是赚到」的 PostgreSQL 特性

很多人对 PostgreSQL 的认识，停留在「一个能替代 MySQL 的开源数据库」。这话没错，但也把它看小了。

PostgreSQL 真正的分量，在于它把一大堆**别的数据库要么没有、要么得靠外部组件硬凑**的能力，做成了内置的、一等公民的特性：半结构化文档(JSONB)、数组与范围类型、递归查询、窗口函数、全文检索、声明式分区、六种索引、原生发布订阅、可编程的过程语言、乃至把数据库直接当分布式锁用……这些拼在一起，让它从「关系数据库」长成了一个**数据后端的瑞士军刀**。

这个专栏做一件事：**把这些特性一个一个拆开，讲清楚它是什么、底下怎么实现的、比别的库强在哪、什么时候该用它。**

## 不是背文档，是「见真章」

市面上讲 PostgreSQL 特性的文章不少，但大多是文档的搬运：把语法抄一遍，给个最简例子，就算讲完了。本专栏不这么干——

<Callout type="info">
  本专栏的每一个特性，都来自一套在**真实 PostgreSQL 18.4 实例**上跑通的测试（托管于 Neon，`ap-southeast-1`）。共 19 项特性，**全部通过**。你在文里看到的每一段 SQL 输出，都是那次实测**真实打印出来的结果**，不是我编的。
</Callout>

这样带来的好处是：我们不只是告诉你「PostgreSQL 支持 X」，而是把 X 跑起来，把输出摊在你面前，再回头讲**为什么是这个结果、数据库内部发生了什么**。写法上沿用一贯的风格：**SQL 在左，人话在右**——先贴真实可跑的语句，再把它翻译成大白话，配上和别家数据库的对照。

## 横向对比，才知道「香」在哪

一个特性孤立地看，你很难体会它的价值。所以每一章都会回答同一个问题：**这件事，换成 MySQL / Oracle / SQL Server / SQLite 会怎么做？** 有的是「别家也有，但 PG 做得更彻底」，有的是「别家压根没有，得在应用层拿几百行代码模拟」。看完对比，你才会明白哪些是 PostgreSQL 真正的护城河。

<Callout type="warn">
  跨库对比基于各数据库**主流稳定版本**的通行认知（如 MySQL 8.x、Oracle 19c+、SQL Server 2019+）。数据库演进很快，某个「别家没有」的结论可能随新版本变化；涉及关键决策时，请以你目标版本的官方文档为准。本专栏所有 PostgreSQL 行为以 **PG 18** 为基准。
</Callout>

## 路线图

我们按「从存什么、到怎么查、到怎么扛规模、再到怎么把逻辑放进库里」这条线，分六站走：

**第一站 · 类型系统：PG 的看家本领** —— PostgreSQL 最不一样的地方，是它的类型多到离谱且都能参与索引与约束。丰富数据类型、数组、JSONB、范围类型与生成列，让「数据库」和「文档库」的界限在这里模糊掉。

**第二站 · 查询表达力：一条 SQL 能走多远** —— CTE 与递归查询、窗口函数、LATERAL、GROUPING SETS、全文检索。这些让很多「以为得写代码循环」的活，一条 SQL 就干完了。

**第三站 · 规模与性能：大表怎么活得好** —— 六种索引怎么选、声明式分区怎么把大表拆小、物化视图怎么把慢查询预计算掉，以及用 EXPLAIN 读懂查询计划——排查慢查询的第一手段。

**第四站 · 过程、事件与并发：把逻辑放进库里** —— PL/pgSQL 与触发器把业务逻辑下沉到数据库、LISTEN/NOTIFY 让数据库直接当消息总线、咨询锁与 `SKIP LOCKED` 让它兼任分布式锁和任务队列。

**第五站 · 生态** —— `CREATE EXTENSION` 一句话，给数据库装上模糊搜索、加密、地理空间等能力。PostgreSQL 的扩展机制，是它长盛不衰的关键。

**第六站 · 收尾** —— 把 19 个特性收拢成一张「PostgreSQL 到底强在哪」的总表，并给出务实的选型建议：什么场景该上 PG，什么场景别硬上。

## 读之前，你最好有

- **会基本 SQL**：`SELECT` / `JOIN` / `GROUP BY` / 建表建索引看得懂就行，不需要是 DBA。
- **用过任意一个关系数据库**：MySQL、SQLite 都行——有对照，才有「原来还能这样」的惊喜。
- **一颗愿意「多问一句为什么」的好奇心**：很多特性你可能听过名字，但「它底下到底怎么实现的、代价在哪」才是这个专栏想补上的那一层。

准备好了，我们从 PostgreSQL 最标志性的地方开始——**它那套多到离谱的数据类型**：[丰富数据类型：类型即一等公民](https://daiw.org/manual/postgresql/rich-types)。

## 本专栏篇目

- [PostgreSQL 特性详解](https://daiw.org/manual/postgresql.md): PostgreSQL 被称作「最先进的开源数据库」，先进在哪？本专栏挑出 19 个真正拉开差距的特性，每个都配 PG 18.4 上的真实 SQL 与输出，横向对比 MySQL / Oracle / SQL Server，并结合实现原理讲透。

### 类型系统 · PG 的看家本领

- [丰富数据类型 · 类型即一等公民](https://daiw.org/manual/postgresql/rich-types.md): PostgreSQL 是 SQL 数据库里类型最齐全的之一：UUID、INET/CIDR、INTERVAL、NUMERIC、BYTEA 全是内置的一等公民，能索引、能比较、能加约束。别的库要在应用层模拟的东西，这里开箱即用。
- [数组运算 · 把「多对多」压进一列](https://daiw.org/manual/postgresql/arrays.md): PostgreSQL 把数组当一等公民：列可以直接是 text[] / int[]，用 @> / && / ANY 做集合判断，用 UNNEST / array_agg 在「数组」和「行」之间双向穿梭，还能用 GIN 索引加速。标签系统、权限位、多选枚举，常能因此省掉一张中间表。
- [JSONB · 关系库里长出一个文档库](https://daiw.org/manual/postgresql/jsonb.md): JSONB 把 JSON 以解析后的二进制格式存储，配上一整套运算符(-> ->> @> ？ ||)、GIN 索引和 SQL/JSON path 查询。它让你在同一张表里既有严格 schema 的列，又有灵活的文档字段——PostgreSQL 因此成了「关系 + 文档」混合库。
- [范围类型与生成列 · 让约束替你把关](https://daiw.org/manual/postgresql/range-generated.md): 范围类型把「一段区间」当成一个值，配上 EXCLUDE 排他约束，数据库能在写入时就拒绝「时段重叠」——会议室预订、资源调度不再靠应用层校验。生成列则让派生字段由数据库自动维护，永远和源列同步。

### 查询表达力 · 一条 SQL 能走多远

- [CTE · 让一条 SQL 学会「递归」](https://daiw.org/manual/postgresql/cte.md): WITH 子句把复杂查询拆成命名的中间步骤；WITH RECURSIVE 让 SQL 能自我引用，一条语句遍历树、生成序列；而「改写型 CTE」能在 WITH 里跑 INSERT/UPDATE/DELETE 再 RETURNING 给下一步——这是 PostgreSQL 的独门绝技。
- [窗口函数 · 不合并行的分组统计](https://daiw.org/manual/postgresql/window-functions.md): 窗口函数为每一行计算「它在所属分组里的排名 / 相对值 / 累计」，却不像 GROUP BY 那样把行合并掉。排名、环比同比、累计销售、每组 Top N、滑动平均——这些「以为得写代码循环」的活，一条 SQL 就干完了。
- [LATERAL 与 GROUPING SETS · 两把撑大表达力的武器](https://daiw.org/manual/postgresql/lateral-grouping.md): LATERAL 让 JOIN 右侧的子查询能引用左表的列——「每个用户最新 3 单」这类每组 Top-N 一句写完；GROUPING SETS / ROLLUP / CUBE 让一条 SQL 同时输出多种粒度的小计与总计，一次查出整张透视表。
- [全文检索 · 数据库自带的搜索引擎](https://daiw.org/manual/postgresql/full-text-search.md): PostgreSQL 内置全文检索，不必外挂 Elasticsearch:tsvector 分词 + 词干归一，tsquery 表达查询，@@ 匹配，ts_rank 打分，GIN 索引让百万文档亚秒响应。比 LIKE '%x%' 强在能词干归一、忽略停用词、按相关性排序。

### 规模与性能 · 大表怎么活得好

- [索引类型大全 · 六种索引怎么选](https://daiw.org/manual/postgresql/indexes.md): PostgreSQL 内置 6 种索引——B-tree、Hash、GIN、GiST、SP-GiST、BRIN，各擅长不同的访问模式。再加上部分索引、表达式索引、覆盖索引这些「修饰」。选对索引类型，是让大表查得快的第一步；BRIN 在时序大表上能小到只有 B-tree 的几分之一。
- [表分区 · 把一张大表拆成很多小表](https://daiw.org/manual/postgresql/partitioning.md): 声明式分区(PG 10+)把一张逻辑大表按 RANGE / LIST / HASH 拆成多张物理子表。查询靠分区裁剪只扫相关分区，老数据 DETACH/DROP 一秒下线（比 DELETE 快几个量级），每个分区还能独立索引、独立 VACUUM。
- [物化视图 · 把慢查询的结果冻起来](https://daiw.org/manual/postgresql/materialized-views.md): 普通 VIEW 只是 SQL 别名，每次查都重算；MATERIALIZED VIEW 把结果物化到磁盘并可加索引，读取 = 直接读物理表，比反复重算快几个量级。代价是数据不实时，要 REFRESH——而 REFRESH CONCURRENTLY 能在不锁读的情况下刷新。
- [EXPLAIN · 读懂 PostgreSQL 的执行计划](https://daiw.org/manual/postgresql/explain.md): EXPLAIN 让优化器摊开它打算怎么执行一条 SQL：走哪个索引、怎么连接、估算多少行；EXPLAIN ANALYZE 真跑一遍给出实测行数与耗时。这是排查慢查询的第一手段——看懂扫描类型、连接方式、估算与实测的偏差，你才知道慢在哪、该加什么索引。

### 过程、事件与并发 · 把逻辑放进库里

- [PL/pgSQL 与触发器 · 让数据库自己干活](https://daiw.org/manual/postgresql/plpgsql-triggers.md): PL/pgSQL 是 PostgreSQL 内置的过程语言（Oracle PL/SQL 风格），用它写函数、存储过程和触发器函数。触发器在 INSERT/UPDATE/DELETE 前后自动调用函数：自动维护 updated_at、写审计日志、维护派生字段、跨表约束——把这些逻辑下沉到数据库，应用怎么写都绕不过去。
- [LISTEN / NOTIFY · 数据库自带的发布订阅](https://daiw.org/manual/postgresql/listen-notify.md): PostgreSQL 内建一套轻量 Pub/Sub：一端 LISTEN 一个通道，另一端 NOTIFY 发消息，触发器里也能 pg_notify。消息随事务走——COMMIT 后才广播。缓存失效通知、轻量任务派发、库内事件钩子，不必再为此单独架一个 Redis。
- [锁与并发 · 咨询锁与 SKIP LOCKED](https://daiw.org/manual/postgresql/locks.md): 咨询锁(advisory lock)是 PostgreSQL 提供的「应用层的锁」，纯靠整数键标识、不绑任何行，让 PG 直接当分布式锁用；而 SELECT ... FOR UPDATE SKIP LOCKED 跳过已被锁的行，是「用数据库当任务队列」的关键——N 个 worker 各领各的活，不打架、不用 Redis。

### 生态

- [扩展生态 · 一句话给数据库装新能力](https://daiw.org/manual/postgresql/extensions.md): CREATE EXTENSION 一句话，给 PostgreSQL 装上模糊搜索(pg_trgm)、加密(pgcrypto)、大小写不敏感文本(citext)、去重音(unaccent)、慢查询分析(pg_stat_statements)乃至地理空间(PostGIS)。可插拔的扩展机制，是 PostgreSQL 长盛不衰、能长成「平台」的关键。

### 收尾

- [收尾 · PostgreSQL 的护城河与选型建议](https://daiw.org/manual/postgresql/recap.md): 把 19 个特性收拢成一张「PostgreSQL 到底强在哪」的总表，提炼出它区别于其它库的三条本质，并给出务实的选型建议——什么场景该上 PG，什么场景别硬上。
