Да, ты можешь!! Решение должно быть простым, безопасным и производительным ...
Я новичок в 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
не беспокоясь о том, как это работает ... они просто получают хорошую производительность. Представление не копирует данные из исходной таблицы, поэтому оно хорошо как с точки зрения памяти, так и с точки зрения производительности. Однако обратите внимание, что вы не можете обновлять / вставлять в представление, только в исходную таблицу, но если вы действительно хотите, я считаю, что вы можете перенаправить вставки и обновления в исходную таблицу с помощью правил (я мог ошибаться в этом последнем пункте, поскольку Сам никогда не пробовал).
Изменить: кажется, что если запрос включает конкурирующие индексы, механизм планировщика может иногда вообще не использовать индекс-выражение. Выбор, похоже, зависит от данных.