サプライヤーデータベースから製品データベースを更新する 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
両方のテーブルで索引付けされています。