Postgresql 加快对多个表的更新

Postgresql 加快对多个表的更新,postgresql,Postgresql,您可能知道,postgres上的更新内部联接不是最好的。我回到了旧的跨多个表更新方法,但在以下查询中遇到了一些性能问题: UPDATE table_a a SET field1 = field4 FROM table_b b , table_c c WHERE a.field3 = b.field3 AND a.field1 = c.field4 AND ((a.field1 Is Null) Or (a.field1 ='')) AND (a.field2 ='T'); 有

您可能知道,postgres上的更新内部联接不是最好的。我回到了旧的跨多个表更新方法,但在以下查询中遇到了一些性能问题:

UPDATE table_a  a
SET    field1 = field4
FROM table_b b , table_c c 
WHERE a.field3 = b.field3 
AND a.field1  = c.field4
AND ((a.field1  Is Null) Or (a.field1 ='')) AND (a.field2 ='T'); 
有没有人有更好/更快的方式在postgres中运行这样的查询


编辑:其中一个联接只是为了确保数据在该表中,尽管我不需要它。

在这次更新中,表
c
的用途是什么?除了
和a.field1=c.field4
(这可能会导致多个
c
行匹配,导致对
a.field1
进行多次更新)之外,它的值从未被使用过。顺便问一句:
设置field1=field4
中的field4是否来自
c
表?@joop验证它的存在,因此,要实现更新,它必须在a、b和c中,我不需要使用任何值,只要联接验证表中有数据,就可以尝试用
存在的
条件替换联接如果没有任何数字或解释计划,很难对性能进行任何说明。您的查询中有几个缺陷:1)您的
WHERE
,当
a.field1为Null
时,
a.field1=c.field4
总是错误的(实际上
Null
),所以这永远不会发生,所以从技术上讲,您的查询会检查
a
中的每一行,
c
中有一行是
c.field4='
。2) 另外,由于
a.field1=c.field4
位于
WHERE
,因此
SET field1=field4
将是一个NOOP(实际上只是触发更新触发器,但根本不更改数据)。