После поиска на stackoverflow.com я обнаружил несколько вопросов, спрашивающих, как удалить дубликаты, но ни один из них не касался скорости.
В моем случае у меня есть таблица с 10 столбцами, которая содержит 5 миллионов точных дубликатов строк.Кроме того, у меня есть как минимум миллион других строк с дубликатами в 9 из 10 столбцов.Моя текущая техника занимает (пока) 3 часа , чтобы удалить эти 5 миллионов строк.Вот мой процесс:
-- 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
Далее,
-- 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
Любые советы о том, как ускорить это или более быстрый путь?Помните, мне придется выполнить это снова для строк, которые не являются точными дубликатами.
Большое спасибо.
ОБНОВЛЕНИЕ:
Мне пришлось остановить выполнение шага 2 на отметке 9 часов,Я попробовал метод OMG Ponies, и он закончился через 40 минут.Я попробовал свой шаг 2 с пакетным удалением Andomar, оно прошло 9 часов, прежде чем я остановил его.ОБНОВЛЕНИЕ: Выполнил аналогичный запрос с одним полем меньше, чтобы избавиться от другого набора дубликатов, и запрос выполнялся всего 4 минуты (8000 строк), используя метод OMG Ponies.
Я попробую метод cteОднако, при следующей возможности, я подозреваю, что метод OMG Ponies будет непростым.