部分索引(Partial Index)是建立在数据表特定行子集之上的索引结构,该子集由一个附加在索引定义末尾的布尔条件谓词(predicate)精确界定:
CREATE INDEX orders_unbilled_index ON orders (order_nr)
WHERE billed is not true;
部分索引仅为满足该谓词条件的行生成索引条目。它的核心工程价值包括:
排除全表中的高频常规值,极大缩小索引物理体积,使索引能够完全常驻共享内存缓存。
大幅降低数据写入时的索引维护开销,因为修改不满足谓词条件的行完全无需触碰该索引。
Example 11.1. 通过部分索引排除常见值
CREATE INDEX access_log_client_ip_ix ON access_log (client_ip)
WHERE NOT (client_ip > inet '192.168.100.0' AND
client_ip < inet '192.168.100.255');
Example 11.2. 通过部分索引排除非关键值
CREATE INDEX orders_unbilled_index ON orders (order_nr)
WHERE billed is not true;
Example 11.3. 建立部分唯一索引
CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
WHERE success;
Example 11.4. 避免使用部分索引替代分区表
-- 不要为每个月都单独创建部分索引,请直接使用表分区