Предварительные вычисления пользовательских функций в postgresql
Я пытаюсь предварительно вычислить пользовательскую функцию для каждой строки. Идея в том, что у меня есть объект JSON в виде текстового объекта в одном из полей, и я хочу проанализировать некоторые другие "поля" из него, которые могут быть возвращены в запросах, как любое другое истинное поле. Однако затраты на синтаксический анализ JSON значительны. Есть ли способ предварительно вычислить эту функцию синтаксического анализа таким образом, чтобы ускорить запросы?
Пожалуйста, воздержитесь от аргументации, что в базе данных не должно быть JSON как текста; Я в курсе плюсов и минусов.
2 ответа
Во-первых, вас может заинтересовать новый тип данных JSON PostgreSQL 9.2 (который скоро будет выпущен).
Что касается вашего вопроса, вы ищете материализованное представление (или более простую форму: избыточный предварительно вычисленный столбец в вашей таблице). "Materialized View" - это просто установленный термин, а не специальный объект в базе данных PostgreSQL. По сути, вы создаете избыточную таблицу с предварительно вычисленными значениями, которую вы обновляете при определенных событиях или своевременно.
Поиск по термину даст вам несколько ответов.
В дополнение к материализованному представлению, имейте в виду, что PostgreSQL также может индексировать выходные данные функций, чтобы вы могли сделать что-то вроде:
CREATE INDEX my_foo_bar_udf_idx ON foo (bar(baz));
Это работает, только если UDF помечен как неизменный, что означает, что вывод зависит только от аргументов. Это дает вам возможность запустить вашу функцию с аргументами запроса, а затем просканировать индекс вместо таблицы. Он не соответствует всем случаям использования, но он удовлетворяет многим из них и часто может избавить вас от головной боли материализации представлений.