Ja, du kannst!! Die Lösung sollte einfach, sicher und performant sein ...
Ich bin neu in postgresql, aber es scheint, dass Sie berechnete Spalten mithilfe eines Ausdrucksindex erstellen können, der mit einer Ansicht gepaart ist (die Ansicht ist optional, erleichtert aber das Leben ein wenig).
Angenommen, meine Berechnung lautet md5(some_string_field)
, dann erstelle ich den Index wie folgt :
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Bei allen Abfragen, die bearbeitet werden, MD5(some_string_field)
wird der Index verwendet, anstatt ihn von Grund auf neu zu berechnen. Beispielsweise:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Sie können dies mit EXPLAIN überprüfen .
An diesem Punkt verlassen Sie sich jedoch darauf, dass Benutzer der Tabelle genau wissen, wie die Spalte erstellt wird. Um das Leben zu vereinfachen, können Sie VIEW
eine erweiterte Version der Originaltabelle erstellen und den berechneten Wert als neue Spalte hinzufügen:
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Jetzt können alle verwendeten Abfragen verwendet some_table_augmented
werden, some_string_field_md5
ohne sich Gedanken darüber zu machen, wie es funktioniert. Sie erhalten nur eine gute Leistung. Die Ansicht kopiert keine Daten aus der Originaltabelle, ist also sowohl speicher- als auch leistungsmäßig gut. Beachten Sie jedoch, dass Sie nicht in eine Ansicht aktualisieren / einfügen können, sondern nur in die Quelltabelle. Wenn Sie dies jedoch wirklich möchten, können Sie Einfügungen und Aktualisierungen mithilfe von Regeln in die Quelltabelle umleiten (in diesem letzten Punkt könnte ich mich irren) Ich habe es selbst nie versucht.
Bearbeiten: Wenn die Abfrage konkurrierende Indizes umfasst, verwendet die Planer-Engine den Ausdrucksindex manchmal überhaupt nicht. Die Wahl scheint datenabhängig zu sein.