Sim você pode!! A solução deve ser fácil, segura e eficiente ...
Eu sou novo no postgresql, mas parece que você pode criar colunas computadas usando um índice de expressão , emparelhado com uma visão (a visão é opcional, mas torna a vida um pouco mais fácil).
Suponha que meu cálculo seja md5(some_string_field)
, então eu crio o índice como:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Agora, qualquer consulta que atue MD5(some_string_field)
usará o índice em vez de computá-lo do zero. Por exemplo:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Você pode verificar isso com o explain .
Entretanto, neste ponto, você está contando com os usuários da tabela que sabem exatamente como construir a coluna. Para tornar a vida mais fácil, você pode criar um VIEW
em uma versão aumentada da tabela original, adicionando o valor calculado como uma nova coluna:
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Agora, qualquer consulta usando some_table_augmented
poderá usar some_string_field_md5
sem se preocupar com como funciona ... eles apenas obtêm um bom desempenho. O modo de exibição não copia nenhum dado da tabela original, por isso é bom em termos de memória e também de desempenho. Observe, no entanto, que você não pode atualizar / inserir em uma exibição, apenas na tabela de origem, mas se você realmente quiser, acredito que você pode redirecionar inserções e atualizações para a tabela de origem usando regras (posso estar errado nesse último ponto, pois Nunca tentei sozinho).
Editar: parece que se a consulta envolver índices concorrentes, o motor do planejador pode às vezes nem usar o índice de expressão. A escolha parece ser dependente dos dados.