11.7. Индексы на выражениях#

11.7. Индексы на выражениях

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 обычно требует использования скобок вокруг выражений индекса, как показано во втором примере. Скобки могут быть не указаны, когда выражение представляет собой простой вызов функции, как в первом примере.

Все выражения индекса относительно дорого обслуживать, потому что вычисление производимого выражения(й) должно выполняться для каждой вставки строки и негорячего обновления. Однако выражения индекса не пересчитываются во время индексированного поиска, так как они уже хранятся в индексе. В обоих приведенных выше примерах система рассматривает запрос просто как WHERE indexedcolumn = 'constant' и поэтому скорость поиска эквивалентна любому другому простому индексу запросу. Таким образом, индексы на выражениях полезны, когда скорость извлечения важнее скорости вставки и обновления.