我有一张大表,包括大约1600万行: POST表:
+--------------------------------+-----------------------------+-----------+ | Column | Type | Modifiers | +--------------------------------+-----------------------------+-----------+ | key | character varying(36) | not null | | category_id | integer | | | owner_id | integer | | +--------------------------------+-----------------------------+-----------+
key的值包含36个随机字符。
INDEXES: btree(key), btree(owner_id), btree(category_id)
我的目标是在此表中添加is_deleted属性,从另一个表更新owner_id(以前为None)。 (约有200万行受影响)
我尝试使用以下格式更新多行:
update post_tbl as p
set owner_id = c.owner_id,
is_deleted = True
from (values
(92485, 137736),
(948130, 250745),
(423832, 1164883),
(685966, 521767),
...
) as c(owner_id, id)
where p.key in c.id;
WITH number_of_rows是100,200,500,1000,2000。然而,它似乎非常慢〜大约每秒10行。 因此,对于2000000行,可能需要大约50个小时。
我也尝试更改postgresql变量:
synchronous_commit=off;
wal_buffers=32;
shared_buffers=1GB;
random_page_cost=0.005;
seq_page_cost=0.005;
但没有太大变化。 (加上我试图删除owner_id中的btree索引,但没有任何变化)
您能否告诉我如何加快此更新?感谢。