Postgres 术语表
PostgreSQL 术语详解,配有可直接运行的 SQL
每个条目都包含简短的定义、可在原生 PostgreSQL 上运行的示例,以及所依据的官方文档链接。
行级安全(RLS)
行级安全让表可以通过 CREATE POLICY 创建的策略,逐行决定每个角色能够查看或修改哪些行。
顺序扫描
顺序扫描会从头到尾读取表中的每一行。EXPLAIN 将其显示为 Seq Scan;对于小表或返回大量行的查询,这是常规的选择。
索引扫描
索引扫描利用索引找到匹配的行,再从表中取出这些行。EXPLAIN 将其显示为 Index Scan;Index Only Scan 则可以跳过对表的访问。
连接池
连接池保持一组已打开的数据库连接,并在众多客户端之间共享,因为每个 PostgreSQL 连接都由一个独立的服务器进程提供服务。
VACUUM 与 autovacuum
VACUUM 回收更新和删除操作遗留的死行版本所占用的空间,更新可见性映射,并防止事务 ID 回卷。autovacuum 会自动为你运行它。
多版本并发控制(MVCC)
MVCC 让读和写可以同时进行:每条语句看到的是数据的一个快照,更新会写入新的行版本,而不是原地覆盖行。
预写式日志(WAL)
预写式日志会在每个变更写入数据文件之前先将其记录下来,使 PostgreSQL 能在崩溃后恢复。WAL 还为复制和时间点恢复提供数据。
EXPLAIN 与 EXPLAIN ANALYZE
EXPLAIN 显示 PostgreSQL 打算如何执行查询;EXPLAIN ANALYZE 还会实际执行查询,并报告每个步骤的实际行数和耗时。
主键
主键是唯一标识每一行的一列或一组列。PostgreSQL 通过唯一的 B-tree 索引和 NOT NULL 来保证它。
外键
外键要求一张表中的值必须与另一张表中的某一行匹配,因此无法指向不存在的行。ON DELETE 决定被引用的行被删除时如何处理。
事务隔离级别
隔离级别决定一个事务能看到多少并发事务所做的修改。PostgreSQL 默认使用 Read Committed,另外还提供 Repeatable Read 和 Serializable。
死锁
当两个事务各自等待对方持有的锁时,就会发生死锁。PostgreSQL 会检测到死锁并取消其中一个事务;按一致的顺序加锁可以预防死锁。
B-tree 索引
B-tree 是 PostgreSQL 的默认索引类型。它支持对可排序数据进行等值和范围比较,并能直接按顺序返回行。
GIN 索引
GIN(通用倒排)索引将值内部的每个元素(例如数组元素、JSONB 键或文本搜索中的词)映射到包含该元素的行。
部分索引
部分索引只覆盖满足 WHERE 条件的行,因此当查询针对的是表中一个明确的子集时,索引会更小、更快。
公用表表达式(CTE)
公用表表达式用 WITH 编写,它为子查询命名,使语句的其余部分可以像使用表一样使用它。WITH RECURSIVE 可以处理树形结构和层级关系。
JSONB 类型
jsonb 以分解后的二进制格式存储 JSON,查询速度快,并且可以建立索引。大多数应用都应使用这种 JSON 类型。
物化视图
物化视图存储查询的结果,可以像表一样读取。读取速度很快,但只有在运行 REFRESH MATERIALIZED VIEW 时数据才会更新。
表分区
分区按范围、列表或哈希将一张逻辑表拆分为多个较小的物理表,使查询和维护只涉及所需的分区。
Upsert 插入或更新(INSERT ... ON CONFLICT)
INSERT ... ON CONFLICT 会插入一行;如果插入会违反唯一约束,则改为更新已有的行或跳过该行,整个过程是一个原子步骤。
窗口函数
窗口函数在一组相关的行上计算值,例如排名或累计总和,而不会像 GROUP BY 那样把这些行合并为一行。
模式(Schema)
模式是数据库内部的命名空间,用于存放表、视图、函数和其他对象。search_path 决定在哪里查找未限定的名称。
角色与权限
在 PostgreSQL 中,用户和组都是角色。GRANT 授予角色对对象的权限,作为另一个角色成员的角色可以使用该角色的权限。
标识列
标识列的值由一个隐式序列自动生成。这是在 PostgreSQL 中创建自增键的 SQL 标准方式。
全文搜索
全文搜索按词语而非精确的子串来匹配文档,使用 tsvector、tsquery 和 @@ 操作符。GIN 索引可以让它更快。