ДА, вы можете !! Решение должно быть простым, безопасным и производительным ...
Я новичок в postgresql, но, кажется, вы можете создавать вычисляемые столбцы с помощью индекс выражения , в сочетании с представлением (представление необязательно, но делает жизнь немного проще).
Предположим, мои вычисления md5(some_string_field)
, тогдаЯ создаю индекс как:
CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));
Теперь любые запросы, которые действуют на MD5(some_string_field)
, будут использовать индекс, а не вычислять его с нуля.Например:
SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);
Вы можете проверить это с помощью объяснение .
Однако на этом этапе вы полагаетесь на пользователей таблицы, которые точно знают, как построить столбец,Чтобы упростить жизнь, вы можете создать VIEW
для расширенной версии исходной таблицы, добавив вычисленное значение в качестве нового столбца:
CREATE VIEW some_table_augmented AS
SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;
Теперь любые запросы, использующие some_table_augmented
, смогутиспользовать some_string_field_md5
, не беспокоясь о том, как это работает .. они просто получают хорошую производительность.Представление не копирует какие-либо данные из исходной таблицы, поэтому оно хорошо как с точки зрения памяти, так и с точки зрения производительности.Однако обратите внимание, что вы не можете обновлять / вставлять в представление, только в исходную таблицу, но если вы действительно этого хотите, я думаю, вы можете перенаправить вставки и обновления в исходную таблицу, используя rules (я мог бынеправильно в последнем пункте, поскольку я никогда не пробовал сам).
Редактировать: кажется, что если запрос включает конкурирующие индексы, механизм планирования может иногда не использовать выражение-индекс ввсе.Выбор зависит от данных.