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 更新加入速度慢的主要内容,如果未能解决你的问题,请参考以下文章

如何解决mysql 查询和更新速度慢

PROteus 仿真速度慢如何解决

Postgresql 内存表空间中的插入速度慢

大表上的第一次查询调用速度非常慢

maven更新远程仓库速度太慢解决方法

pve 管理网卡 速度慢