postgreSQLクエリが無限ループで実行されているようです
Aug 24 2020
前の質問に続いて、データベースから重複を削除しようとしています。私は最初にサブクエリを実行して、ほぼ同一のレコードを識別しています(唯一の違いは、インデックス列「id」です)。私のテーブルには約900万のレコードがあり、以下のコードは約1時間30分後に中断する必要がありました
DELETE FROM public."OptionsData"
WHERE id NOT IN
(
SELECT id FROM (
SELECT DISTINCT ON (asofdate, contract, strike, expiry, type, last, bid, ask, volume, iv, moneyness, underlying, underlyingprice) * FROM public."OptionsData"
) AS TempTable
);
サブクエリからの結果の生成には約1分かかるため、完全なクエリの実行には長い時間がかかる可能性があります(?)、またはコードに何か問題がありますか?
回答
3 a_horse_with_no_name Aug 24 2020 at 20:20
NOTINをDISTINCTと組み合わせると、通常は非常に遅くなります。
EXISTSを使用して重複を削除する方が、通常は高速です。
DELETE FROM public."OptionsData" d1
WHERE EXISTS (select *
from public."OptionsData" d2
where d1.id > d2.id
and (d1.asofdate, d1.contract, d1.strike, d1.expiry, d1.type, d1.last, d1.bid, d1.ask, d1.volume, d1.iv, d1.moneyness, d1.underlying, d1.underlyingprice)
= (d2.asofdate, d2.contract, d2.strike, d2.expiry, d2.type, d2.last, d2.bid, d2.ask, d2.volume, d2.iv, d2.moneyness, d2.underlying, d2.underlyingprice)
)
これにより、の値が最小の行が保持されidます。id使用頻度が最も高いものを保持したい場合where d1.id < d2.id。