我正在尝试按行预先计算用户定义的函数。这个想法是我在其中一个字段中将 JSON 对象作为文本对象,并且我想从中解析出一些其他“字段”,这些字段可以像任何其他真实字段一样在查询中返回。但是,解析 JSON 的开销很大。有没有办法以加速查询的方式预先计算这个解析函数?
请不要争辩说首先不应该有 JSON 作为数据库上的文本;我知道利弊。
我正在尝试按行预先计算用户定义的函数。这个想法是我在其中一个字段中将 JSON 对象作为文本对象,并且我想从中解析出一些其他“字段”,这些字段可以像任何其他真实字段一样在查询中返回。但是,解析 JSON 的开销很大。有没有办法以加速查询的方式预先计算这个解析函数?
请不要争辩说首先不应该有 JSON 作为数据库上的文本;我知道利弊。
首先,您可能对即将发布的 PostgreSQL 9.2(即将发布)的JSON 数据类型感兴趣。
至于您的问题,您正在寻找物化视图(或更简单的形式:表中的冗余预计算列)。“物化视图”只是一个既定术语,而不是 PostgreSQL 数据库中的特殊对象。基本上,您使用预先计算的值创建一个冗余表,您可以在某些事件或及时刷新。
搜索这个词会给你一些答案。
除了物化视图之外,请记住 PostgreSQL 还可以索引函数的输出,因此您可以执行以下操作:
CREATE INDEX my_foo_bar_udf_idx ON foo (bar(baz));
这仅在 UDF 被标记为不可变时才有效,这意味着输出仅取决于参数。这使您可以选择针对查询参数运行函数,然后扫描索引而不是表。它不能满足所有用例,但它确实满足了许多用例,而且它通常可以为您省去物化视图的麻烦。