La query postgreSQL sembra essere in esecuzione su un ciclo infinito
Seguendo la mia domanda precedente , ora sto cercando di rimuovere i duplicati dal mio database. Per prima cosa eseguo una sottoquery per identificare i record quasi identici (l'unica differenza sarebbe la colonna dell'indice "id"). La mia tabella ha circa 9 milioni di record e il codice seguente è stato interrotto dopo circa 1 ora e 30 minuti
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
);
La produzione dei risultati dalla sottoquery richiede circa 1 minuto, quindi forse l'esecuzione della query completa potrebbe richiedere molto tempo (?) O c'è qualcosa di sbagliato nel mio codice, per favore?
Risposte
NOT IN combinato con un DISTINCT è solitamente piuttosto lento.
Per eliminare i duplicati utilizzando EXISTS è in genere più veloce:
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)
)
Ciò manterrà le righe con il valore più piccolo in id. Se vuoi mantenere quelli con il massimo idutilizzo where d1.id < d2.id.