Dopo aver cercato StackOverflow.com ho trovato diverse domande in cui si chiedeva come rimuovere i duplicati, ma nessuno di questi ha indirizzato la velocità.La tecnica più veloce per eliminare i dati duplicati
Nel mio caso ho una tabella con 10 colonne che contiene 5 milioni di duplicati di riga esatta. Inoltre, ho almeno un milione di altre righe con duplicati in 9 delle 10 colonne. La mia tecnica attuale sta prendendo (finora) 3 ore per eliminare questi 5 milioni di righe. Qui è il mio processo:
-- Step 1: **This step took 13 minutes.** Insert only one of the n duplicate rows into a temp table
select
MAX(prikey) as MaxPriKey, -- identity(1, 1)
a,
b,
c,
d,
e,
f,
g,
h,
i
into #dupTemp
FROM sourceTable
group by
a,
b,
c,
d,
e,
f,
g,
h,
i
having COUNT(*) > 1
Avanti,
-- Step 2: **This step is taking the 3+ hours**
-- delete the row when all the non-unique columns are the same (duplicates) and
-- have a smaller prikey not equal to the max prikey
delete
from sourceTable
from sourceTable
inner join #dupTemp on
sourceTable.a = #dupTemp.a and
sourceTable.b = #dupTemp.b and
sourceTable.c = #dupTemp.c and
sourceTable.d = #dupTemp.d and
sourceTable.e = #dupTemp.e and
sourceTable.f = #dupTemp.f and
sourceTable.g = #dupTemp.g and
sourceTable.h = #dupTemp.h and
sourceTable.i = #dupTemp.i and
sourceTable.PriKey != #dupTemp.MaxPriKey
Eventuali suggerimenti su come accelerare questo, o un modo più veloce? Ricorda che dovrò eseguirlo di nuovo per le righe che non sono duplicati esatti.
Grazie mille.
AGGIORNAMENTO:
Ho dovuto interrompere il passaggio 2 per l'esecuzione al punto 9 ore. Ho provato il metodo di OMG Ponies e ho finito dopo soli 40 minuti. Ho provato il mio passaggio 2 con l'eliminazione batch di Andomar, ha funzionato 9 ore prima che l'avessi interrotto. AGGIORNAMENTO: Effettuato una query simile con un campo in meno per sbarazzarsi di un diverso set di duplicati e la query è stata eseguita per soli 4 minuti (8000 righe) utilizzando il metodo di OMG Ponies.
Proverò la tecnica cte alla prossima occasione, tuttavia, sospetto che il metodo di OMG Ponies sarà difficile da battere.
Un paio di semplici ottimizzazioni alle vostre domande di cui sopra - non è necessario avere a, b, c, ecc nel 'select' della query principale - basta il PriKey, e rilasciare il HAVING - poi , nella seconda query solo 'DELETE FROM sourceTable WHERE PriKey NOT IN (SELEZIONA DT.MaxPriKey FROM #dupTemp DT)' –
Grazie per il suggerimento. –