Ваш запрос пытается удалить миллион строк для той же строки.Например, если у вас есть эти данные:
body id
a 1
a 2
a 3
a 4
Затем ваш запрос пытается выполнить следующие удаления:
c.body c.id c2.id
a 1 4
a 1 3
a 1 2
a 2 4
a 2 3
a 3 4
Вы можете увидеть, как это приведет к большой работе для базы данных,как число id
s на данном body
увеличении.
Вы можете исправить это, используя вместо этого group by
:
delete c
from comment c join
(select c2.body, max(c2.id) as max_id
from comment c2
group by c2.body
) c2
on c2.body = c.body and c.id < c2.max_id;
Кроме того, вы хотите, чтобы индекс был comment(body, id)
.
Вы также можете обнаружить, что анти-объединение работает лучше, чем соединение, которое вы пытаетесь:
delete c
from comment c left join
comment c2
on c2.body = c.body and c2.id > c.id
where c2.id is null;