postgres 更新加入速度慢
Posted
技术标签:
【中文标题】postgres 更新加入速度慢【英文标题】:postgres update with join slow performance 【发布时间】:2022-01-15 23:13:06 【问题描述】:我有下面的表格并尝试从第二个表格更新到第一个表格,这似乎需要超过 15 分钟,然后我就杀了它。
基本上只是试图将表中的一个字段设置为另一个字段。这两个表都有大约 250 万行。我们如何优化这个操作?
第一个表:
\d table1
Table "public.fa_market_urunu"
Column | Type | Collation | Nullable | Default
--------------+-----------------------------+-----------+----------+-----------------------
id | character varying | | not null |
ad | character varying | | |
url | character varying | | |
image_url | character varying | | |
satici_id | character varying | | not null |
satici | character varying | | not null |
category_id | character varying | | |
date_created | timestamp with time zone | | not null | now()
last_updated | timestamp(3) with time zone | | not null | now()
fiyat | double precision | | |
Indexes:
"tbl1_pkey" PRIMARY KEY, btree (id)
"tbl1_satici" UNIQUE, btree (id, satici)
"tbl1_satici_id" UNIQUE, btree (satici, id)
"tbl1_satici_id_last_updated" UNIQUE, btree (satici, id, last_updated)
"tbl1_satici_id_satici_key" UNIQUE CONSTRAINT, btree (satici_id, satici)
"tbl1_satici_last_updated_id" UNIQUE, btree (satici, last_updated, id)
"tbl1_last_updated" btree (last_updated)
"tbl1_satici_category" btree (satici, category_id)
"tbl1_satici_category_last_updated" btree (satici, category_id, last_updated)
"tbl1_satici_last_updated" btree (satici, last_updated)
第二张桌子:
\d table2
Table "public.temp_son_fiyat"
Column | Type | Collation | Nullable | Default
---------+-------------------+-----------+----------+---------
urun_id | character varying | | |
satici | character varying | | |
fiyat | double precision | | |
Indexes:
"ind_u" UNIQUE, btree (urun_id, satici)
我的操作:
UPDATE table1 mu
SET fiyat = fn.fiyat
FROM table2 AS fn
WHERE mu.satici_id = fn.urun_id AND mu.satici = fn.satici;
【问题讨论】:
你能显示你更新的解释吗? 只是为了检查 UPDATE 是否依赖于“ind_u”和“tbl1_satici_id_satici_key”索引并且应该是这种情况。 它适用于 where 子句,但它也执行完整的顺序扫描。 我怀疑这是因为所有索引都需要在每次更新时重新计算,如果在每次更新时删除/插入一行,无论哪一列。 嗯,我对table1
上的索引数量感到有点惊讶,你真的需要所有这些吗?然后进行 seq 扫描可以解释性能不佳的原因。问题是为什么要进行序列扫描?
【参考方案1】:
这是由于索引而发生的。无论列是否更新,postgres 中的每次更新都被视为该行的重新插入,因此所有索引都会重新计算。为了使其更快,删除索引或交换到新表会起作用(如果可能的话)。
【讨论】:
以上是关于postgres 更新加入速度慢的主要内容,如果未能解决你的问题,请参考以下文章