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