索引列不必只是底层表中的一个列,它也可以是表中一个或多个列计算出的函数或标量表达式。此功能对于基于计算结果快速访问表非常有用。
例如,执行不区分大小写比较的常用方法是使用 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'
,因此搜索速度等同于任何其他简单的索引查询。因此,当检索速度比插入和更新速度更重要时,表达式上的索引非常有用。
如果您在文档中看到任何不正确、不符合您对特定功能的使用经验或需要进一步澄清的内容,请使用 此表单 报告文档问题。