Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres:附加到大型jsonb数组是否昂贵?_Postgresql_Jsonb - Fatal编程技术网

Postgresql Postgres:附加到大型jsonb数组是否昂贵?

Postgresql Postgres:附加到大型jsonb数组是否昂贵?,postgresql,jsonb,Postgresql,Jsonb,假设我有一个表t,其中有列t\u id(uuid),xs(jsonb,一个json数组) 我的问题是,SQLupdate t set xs=xs | |'[“x1”,“x2”]::jsonb其中t|id=“some uuid”昂贵吗 它可能很昂贵,原因有两个: a) |运算符解析左操作数,因此如果左操作数较大,解析成本会很高 b) 我听说如果您更新任何列,PG将更新整行,因为xs列很大,这涉及读取原始值(左操作数),将其与新值连接,并将结果写入磁盘到新位置(磁盘上) 我说的对吗?您的第二点非常正

假设我有一个表
t
,其中有列
t\u id(uuid)
xs(jsonb,一个json数组)

我的问题是,SQL
update t set xs=xs | |'[“x1”,“x2”]::jsonb其中t|id=“some uuid”
昂贵吗

它可能很昂贵,原因有两个:

a)
|
运算符解析左操作数,因此如果左操作数较大,解析成本会很高

b) 我听说如果您更新任何列,PG将更新整行,因为
xs
列很大,这涉及读取原始值(左操作数),将其与新值连接,并将结果写入磁盘到新位置(磁盘上)


我说的对吗?

您的第二点非常正确:PostgreSQL读取整行,修改值,并将一个全新的行版本写入表中。保留旧的行版本以提供并发读取

修改大型的
jsonb
不会非常昂贵,但整个过程都必须被塞进RAM中

您最好规范化表结构,并将接受定期修改的JSON属性存储在单独的表中。这将使手术更便宜