이전 질문에 따라 이제 데이터베이스에서 중복을 제거하려고합니다. 거의 동일한 레코드를 식별하기 위해 먼저 하위 쿼리를 실행하고 있습니다 (유일한 차이점은 인덱스 열 "id"). 내 테이블에는 약 9 백만 개의 레코드가 있으며 아래 코드는 약 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 분이 걸리므로 전체 쿼리를 실행하는 데 시간이 오래 걸릴 수 있습니다 (?) 또는 내 코드에 뭔가 문제가 있습니까?
NOT IN과 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
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다