0

サプライヤーデータベースから製品データベースを更新する SQL コードを書いています。これを行うには、サプライヤー データベースをインポートします。これまでのところ、すべてが機能します。次に、次のコマンドを実行して、データベースで使用できるが、サプライヤー データベースにはリストされていないすべての ID 番号のリストを取得します。

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

EXPLAIN メッセージは「SetOp Except (cost=151027.48..154845.30 rows=454191 width=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
);

EXPLAIN メッセージは「製品の更新 (cost=224829.78..279637.52 rows=152540 width=640)」です。

ただし、2 番目のコマンドの実行には少なくとも 15 分かかり、これはあまり受け入れられません。このプロセスを大幅に高速化する Postgres でこれを行う方法はありますか? また、EXPLAIN の結果を適切に解釈していない可能性がありますが、コストが 2 倍しかないことを考えると、2 番目のコマンドは最初のコマンドの 2 倍の時間しかかからないのでしょうか?

SELECT INTO を使用して、最初の SELECT クエリから一時テーブルを作成しようとしました。実行時間はまったく変わりませんでした。また、id_number両方のテーブルで索引付けされています。

4

2 に答える 2

1

このクエリを実行するとどうなりますか?

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)

それが役に立てば幸い!

于 2013-11-06T18:17:31.823 に答える