Kaj*_*Abt 3 sql postgresql union postgresql-performance
之前可能已经提出过这个问题,但谷歌搜索"IN"这样的关键字效果不佳.
这是我的查询:
UPDATE tblCustomer SET type = 2
WHERE idcustomer
IN (SELECT fidcustomer1
FROM tblorder
UNION
SELECT fidcustomer2
FROM tblorder
)
Run Code Online (Sandbox Code Playgroud)
要打破它:我想将所有客户的类型(只是一个int)设置为2,对于出现在order-table中的所有客户,在任一列中.
在我的测试数据中,这些表中没有一行包含超过几百行,但查询运行了很多分钟(即使没有UNION,这似乎没有太大区别),显然重新执行内部查询客户每行一次.我显然可以将它重写为单个SELECT DISTINCT(id),然后进行几百个单行更新,并以我用于ODBC访问的任何语言执行逻辑,但这只是一个黑客攻击.
我怎样才能正确地重写这个?
附录:我要更新的表包含很多相对较大的BYTEA blob,每行几MB.它们被设置为Storage External或Extended,但我想知道这是否会使顺序扫描变慢.所有更新似乎都需要很长时间,而不仅仅是这一次.
我建议一个更简单的方法:
UPDATE tblCustomer c
SET type = 2
FROM tblorder o
WHERE c.idcustomer IN (o.fidcustomer1, o.fidcustomer2)
AND c.type IS DISTINCT FROM 2 -- optional, to avoid empty updates
Run Code Online (Sandbox Code Playgroud)
除此之外,如果有重复的tblorder,那么类似的方法来你有什么是明智的:
UPDATE tblCustomer c
SET type = 2
FROM (
SELECT fidcustomer1 AS cust FROM tblorder
UNION
SELECT fidcustomer2 FROM tblorder
) o
WHERE c.idcustomer = o.cust
AND c.type IS DISTINCT FROM 2;
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,在PostgreSQL中,加入表定期执行比IN表达更好.
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |