0

我正在编写 SQL 代码以从我们的供应商数据库更新我们的产品数据库。为此,我导入了供应商数据库。到目前为止一切正常。然后,我运行以下命令来获取我们数据库中可用但不再在供应商数据库中列出的所有 ID 号的列表:

SELECT id_number
FROM products
WHERE available IS true
EXCEPT
SELECT id_number
FROM supplier_db;

解释消息是“SetOp 除外(成本=151027.48..154845.30 行=454191 宽度=4)”

这运行良好,大约 1-2 秒。EXPLAIN 给这个命令一个成本 151027.48。但是,我的最终目标是available在此列表中出现 ID 号的每一行上将布尔值设置为 false。所以我使用以下命令:

UPDATE products
SET available = false
WHERE id_number IN (
    SELECT id_number
    FROM products
    WHERE available IS true
    EXCEPT
    SELECT id_number
    FROM supplier_db
);

解释消息是“产品更新(成本=224829.78..279637.52 行=152540 宽度=640)”

但是,第二个命令至少需要 15 分钟才能运行,这实际上是不可接受的。在 Postgres 中有什么方法可以显着加快这个过程吗?另外,我可能没有正确解释 EXPLAIN 结果,但是考虑到成本只有两倍,第二个命令不应该只花费第一个命令的两倍吗?

我尝试使用 SELECT INTO 从第一个 SELECT 查询创建一个临时表。它根本没有改变运行时间。此外,id_number在两个表中都有索引。

4

2 回答 2

1

What happens if you run this query?

update products p
set available = false
where available = true
and not exists (select 1 from supplier_db sdb where sdb.id_number = p.id_number)

Hope it helps!

于 2013-11-06T18:17:31.823 回答
0

像这样尝试它,或者它的not exists()变体:

UPDATE products
SET available = false
WHERE available
AND id_number NOT IN (
    SELECT id_number
    FROM supplier_db
);
于 2013-11-06T16:23:16.530 回答