Después de buscar en stackoverflow.com encontré varias preguntas sobre cómo eliminar duplicados, pero ninguno de ellos abordaba la velocidad.La técnica más rápida para eliminar datos duplicados
En mi caso, tengo una tabla con 10 columnas que contiene 5 millones de duplicados de filas exactas. Además, tengo al menos un millón de filas con duplicados en 9 de las 10 columnas. Mi técnica actual está tomando (hasta ahora) 3 horas para borrar estas 5 millones de filas. Aquí está mi proceso:
-- 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
A continuación,
-- 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
Algún consejo sobre la manera de acelerar este proceso, o de una manera más rápida? Recuerde que tendré que volver a ejecutar esto para las filas que no sean duplicados exactos.
Muchas gracias.
ACTUALIZACIÓN:
Tuve que detener el paso 2 para que no se ejecutara en la marca de las 9 horas. Probé el método de Ponies de OMG y terminó después de solo 40 minutos. Probé mi paso 2 con la eliminación por lotes de Andomar, funcionó las 9 horas antes de que lo detuviera. ACTUALIZACIÓN: Se realizó una consulta similar con un campo menos para deshacerse de un conjunto diferente de duplicados y la consulta se ejecutó solo durante 4 minutos (8000 filas) utilizando el método de los Ponies de OMG.
Voy a probar la técnica cte la próxima vez que me lleguen, sin embargo, sospecho que el método de OMG Ponies será difícil de superar.
Un par de sencillos optimizaciones a sus consultas por encima de - no es necesario tener a, b, c, etc., en el 'SELECT' de la consulta arriba - sólo tiene la PriKey, y soltar el HAVING - a continuación, , en la segunda consulta simplemente 'DELETE FROM sourceTable WHERE PriKey NOT IN (SELECCIONE DT.MaxPriKey FROM #dupTemp DT)' –
Gracias por la sugerencia. –