f_jsonb_select_keys
查看此答案中的函数:
How to select sub-object with given keys from JSONB?
https://www.postgresql.org/docs/current/functions-aggregate.html
支持部分模式的聚合函数有资格参与各种优化,例如并行聚合。
在这里,jsonb_object_agg部分节点是NO
https://www.postgresql.org/docs/15/parallel-safety.html
通常,如果一个函数在受限或不安全时被标记为安全,或者如果它在实际上不安全时被标记为受限,则在并行查询中使用时可能会抛出错误或产生错误答案。如果被错误标记,C 语言函数在理论上可能会表现出完全未定义的行为,因为系统无法保护自己不受任意 C 代码的影响,但在大多数情况下,结果不会比任何其他函数差。如果有疑问,最好将函数标记为不安全。
CREATE OR REPLACE FUNCTION f_jsonb_select_keys(_js jsonb, _keys text[])
RETURNS jsonb
LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
SELECT jsonb_object_agg(t.key, t.value)
FROM jsonb_each(_js) t
WHERE t.key = ANY (_keys);
$func$;
jsonb_each
并行是安全的,但是从上面的手册摘录来看,jsonb_object_agg
并行是不安全的吗?- 总的来说,函数
f_jsonb_select_keys
并行安全吗?
函数不需要“部分模式”
PARALLEL SAFE
。所有涉及的函数都是并行安全的,因此我的自定义函数也可以安全地标记为PARALLEL SAFE
。手册:
另外,考虑一下:如果
f_jsonb_select_keys()
在查询中使用 并且规划器使用多个工作进程,则嵌套jsonb_object_agg()
只会聚合其“自己”的输出jsonb_each()
,不会与其他进程重叠。没有什么可以扰乱并行性。