2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:开发版
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4

11.7. 表达式索引 #

索引列不一定是基础表的列,也可以是根据表的一个或多个列计算出的函数或标量表达式。此功能有助于基于计算结果快速访问表。

例如,执行不区分大小写比较的常用方法是使用 lower 函数

SELECT * FROM test1 WHERE lower(col1) = 'value';

如果已在 lower(col1) 函数的结果上定义了索引,则此查询可以使用该索引。

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));

如果我们将此索引声明为 UNIQUE,它将阻止创建 col1 值仅在大小写上不同的行的创建,以及 col1 值实际上相同的行的创建。因此,表达式索引可用于实施无法定义为简单唯一约束的约束。

再举一个例子,如果经常执行如下查询:

SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';

那么创建这样的索引可能值得:

CREATE INDEX people_names ON people ((first_name || ' ' || last_name));

CREATE INDEX 命令的语法通常要求在索引表达式周围加上括号,如第二个示例所示。当表达式只是一个函数调用时,可以省略括号,如第一个示例所示。

索引表达式维护起来相对昂贵,因为必须为每个行插入和非HOT更新计算派生表达式。但是,在索引搜索期间不会重新计算索引表达式,因为它们已存储在索引中。在以上两个示例中,系统将查询视为 WHERE indexedcolumn = 'constant',因此搜索速度与任何其他简单索引查询相同。因此,当检索速度比插入和更新速度更重要时,表达式索引很有用。

提交更正

如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表单报告文档问题。