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
обычно требует использования скобок вокруг выражений индекса, как показано во втором примере. Скобки могут быть не указаны, когда выражение представляет собой простой вызов функции, как в первом примере.
Индексные выражения относительно дорого обходятся в обслуживании, потому что производные выражения должны вычисляться для каждой вставки строки и не-HOT обновления. Однако индексные выражения не пересчитываются во время индексированного поиска, так как они уже хранятся в индексе. В обоих приведенных выше примерах система видит запрос просто как WHERE indexedcolumn = 'constant'
, и поэтому скорость поиска эквивалентна любому другому простому запросу по индексу. Таким образом, индексы на выражениях полезны, когда скорость извлечения более важна, чем скорость вставки и обновления.