Una columna de índice no necesita ser simplemente una columna de la tabla subyacente, sino que puede ser una función o expresión escalar calculada a partir de una o más columnas de la tabla. Esta característica es útil para obtener un acceso rápido a las tablas basándose en los resultados de los cálculos.
Por ejemplo, una forma común de realizar comparaciones que no distingan entre mayúsculas y minúsculas es
usar la función lower:
SELECT * FROM test1 WHERE lower(col1) = 'value';
Esta consulta puede usar un índice si se ha
definido uno sobre el resultado de la función lower(col1):
CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
Si declaráramos este índice como UNIQUE, evitaría la
creación de filas cuyos valores de col1 difieran solo en mayúsculas/minúsculas,
así como filas cuyos valores de col1 sean realmente idénticos.
Por lo tanto, los índices sobre expresiones se pueden usar para hacer cumplir restricciones que
no se pueden definir como restricciones únicas simples.
Como otro ejemplo, si a menudo se realizan consultas como:
SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
entonces podría valer la pena crear un índice como este:
CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
La sintaxis del comando CREATE INDEX normalmente requiere
escribir paréntesis alrededor de las expresiones del índice, como se muestra en el segundo
ejemplo. Los paréntesis se pueden omitir cuando la expresión es simplemente
una llamada a una función, como en el primer ejemplo.
Las expresiones de índice son relativamente costosas de mantener, porque las
expresiones derivadas deben calcularse para cada inserción de fila
y para cada actualización que no sea HOT. Sin embargo, las expresiones del índice
no se vuelven a calcular durante una búsqueda indexada, ya que ya están
almacenadas en el índice. En los dos ejemplos anteriores, el sistema
ve la consulta simplemente como WHERE columna_indexada = 'constante'
y, por lo tanto, la velocidad de la búsqueda es equivalente a cualquier otra consulta de índice
simple. Por lo tanto, los índices sobre expresiones son útiles cuando la velocidad de recuperación
es más importante que la velocidad de inserción y actualización.