Si, puoi!! La soluzione dovrebbe essere facile, sicura e performante ...
Sono nuovo di postgresql, ma sembra che tu possa creare colonne calcolate utilizzando un indice di espressione , associato a una vista (la vista è opzionale, ma rende la vita un po 'più facile).
Supponiamo che il mio calcolo sia md5(some_string_field)
, quindi creo l'indice come:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Ora, qualsiasi query su cui agisce MD5(some_string_field)
utilizzerà l'indice anziché calcolarlo da zero. Per esempio:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Puoi verificarlo con spiegare .
Tuttavia a questo punto ti affidi agli utenti della tabella che sanno esattamente come costruire la colonna. Per semplificarti la vita, puoi creare una VIEW
versione aumentata della tabella originale, aggiungendo il valore calcolato come nuova colonna:
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Ora tutte le query che utilizzano some_table_augmented
saranno in grado di essere utilizzate some_string_field_md5
senza preoccuparsi di come funziona .. ottengono solo buone prestazioni. La vista non copia alcun dato dalla tabella originale, quindi è buona sia dal punto di vista della memoria che da quello delle prestazioni. Nota tuttavia che non puoi aggiornare / inserire in una vista, solo nella tabella di origine, ma se lo desideri davvero, credo che tu possa reindirizzare gli inserimenti e gli aggiornamenti alla tabella di origine utilizzando le regole (potrei sbagliarmi su quest'ultimo punto come Non l'ho mai provato io stesso).
Modifica: sembra che se la query coinvolge indici concorrenti, il motore di pianificazione a volte potrebbe non utilizzare affatto l'indice di espressione. La scelta sembra dipendere dai dati.