Nach stackoverflow.com fand ich mehrere Fragen, wie man Duplikate entfernen kann, aber keiner von ihnen adressiert Geschwindigkeit.Schnellste Technik zum Löschen von doppelten Daten
In meinem Fall habe ich eine Tabelle mit 10 Spalten, die 5 Millionen exakte Reihe Duplikate enthält. Zusätzlich habe ich mindestens eine Million andere Zeilen mit Duplikaten in 9 der 10 Spalten. Meine derzeitige Technik nimmt (bisher) 3 Stunden, um diese 5 Millionen Zeilen zu löschen. Hier ist mein Prozess:
-- 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
Als nächstes
-- 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
Irgendwelche Tipps, wie dies zu beschleunigen, oder einen schnelleren Weg? Denken Sie daran, dass ich das für Zeilen wiederholen muss, die keine genauen Duplikate sind.
Vielen Dank.
UPDATE:
Ich musste Schritt 2 von der 9-Stunden-Marke zu stoppen. Ich habe die Methode von OMG Ponies versucht und sie ist nach 40 Minuten fertig. Ich versuchte meinen Schritt 2 mit Andomar's Batch löschen, es lief die 9 Stunden bevor ich es aufhörte. UPDATE: Eine ähnliche Abfrage mit einem Feld weniger ausgeführt, um eine andere Reihe von Duplikaten loszuwerden, und die Abfrage lief nur für 4 Minuten (8000 Zeilen) mit der Methode von OMG Ponies.
Ich werde versuchen, die CTE-Technik die nächste Chance, die ich bekomme, aber ich vermute, OMG Ponies 'Methode wird schwer zu schlagen sein.
Ein paar einfache Optimierungen auf Ihre Fragen über - Sie brauchen nicht a, b, c usw. im 'SELECT' der Top-Abfrage - Sie die priKey gerade benötigen, und die HAVING fallen - dann , in der zweiten Abfrage nur 'DELETE FROM sourceTable WHERE PriKey NICHT IN (SELECT DT.MaxPriKey VON # dupTemp DT)' –
Danke für den Tipp. –