¡¡Sí tu puedes!! La solución debe ser fácil, segura y eficaz ...
Soy nuevo en postgresql, pero parece que puede crear columnas calculadas usando un índice de expresión , emparejado con una vista (la vista es opcional, pero hace la vida un poco más fácil).
Supongamos que mi cálculo es md5(some_string_field)
, luego creo el índice como:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Ahora, cualquier consulta que actúe MD5(some_string_field)
utilizará el índice en lugar de calcularlo desde cero. Por ejemplo:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Puedes comprobar esto con explicar .
Sin embargo, en este punto, confía en que los usuarios de la tabla sepan exactamente cómo construir la columna. Para hacer la vida más fácil, puede crear una VIEW
versión aumentada de la tabla original, agregando el valor calculado como una nueva columna:
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Ahora, cualquier consulta que utilice some_table_augmented
podrá utilizarse some_string_field_md5
sin preocuparse por cómo funciona ... simplemente obtienen un buen rendimiento. La vista no copia ningún dato de la tabla original, por lo que es buena tanto en cuanto a memoria como a rendimiento. Sin embargo, tenga en cuenta que no puede actualizar / insertar en una vista, solo en la tabla de origen, pero si realmente lo desea, creo que puede redirigir las inserciones y actualizaciones a la tabla de origen utilizando reglas (podría estar equivocado en ese último punto ya que Yo nunca lo he probado).
Editar: parece que si la consulta involucra índices en competencia, el motor del planificador a veces puede no usar el índice de expresión en absoluto. La elección parece depender de los datos.