【发布时间】:2012-11-02 21:05:31
【问题描述】:
这可能以前被问过,但谷歌搜索“IN”之类的关键字效果不佳。
这是我的查询:
UPDATE tblCustomer SET type = 2
WHERE idcustomer
IN (SELECT fidcustomer1
FROM tblorder
UNION
SELECT fidcustomer2
FROM tblorder
)
分解它:我想将出现在订单表中的所有客户的所有客户的类型(只是一个 int)设置为 2,位于任一列中。
在我的测试数据上,这些表中没有一个包含超过几百行,但查询运行了很多分钟(即使没有 UNION,这似乎也没有太大区别),显然是在重新做客户中每行一次内部查询。我显然可以将其重写为单个 SELECT DISTINCT(id),然后进行数百次单行更新,并以我用于 ODBC 访问的任何语言执行逻辑,但这只是一个 hack。
我怎样才能正确地重写这个?
附录:我要更新的表包含很多相对较大的 BYTEA blob,每行几 MB。它们设置为外部存储或扩展,但我想知道这是否会使顺序扫描变慢。所有更新似乎都需要很长时间,不仅仅是这一次。
【问题讨论】:
-
EXPLAIN ANALYZE对于性能问题很有用。见stackoverflow.com/tags/postgresql-performance/info
标签: sql postgresql union postgresql-performance