11.7. Índices sobre expresiones #

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.