9.3 9.4 9.5 9.6 10 11 12 13 14 15 Current(16) 17
问题报告 纠错本页面

11.7. 表达式索引 #

一个索引列并不一定是底层表的一个列,也可以是从表的一列或多列计算而来的一个函数或者标量表达式。这种特性对于根据计算结果快速获取表中内容是有用的。

例如,一种进行大小写不敏感比较的常用方法是使用lower函数:

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

这种查询可以利用一个建立在lower(col1)函数结果之上的索引:

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

如果我们将该索引声明为UNIQUE,它将阻止创建在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', 因此搜索速度与任何其他简单索引查询相当。因此,当检索速度比插入和更新速度更重要时, 表达式索引是有用的。