Как ускорить удаление дубликатов? - PullRequest
0 голосов
/ 07 июня 2019

В таблице с 1,7 миллионами строк я пытался удалить дубликаты сообщений:

delete a FROM comment a
  INNER JOIN comment a2
     WHERE a.id < a2.id
     AND   a.body = a2.body;

Результат был:

  Query OK, 35071 rows affected (5 hours 36 min 48.79 sec)

Это произошло на моей почти бездействующей рабочей станции с Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz. Мне интересно, есть ли какие-нибудь хитрости, чтобы ускорить эту операцию удаления?

Ответы [ 3 ]

0 голосов
/ 07 июня 2019

Следующий запрос будет вам полезен.

Delete  YourTableName 
From    (
Select  row_number() over(Partition by ColName1,ColName2,ColName3 order by ColName1,ColName2,ColName3 Asc)As RowNumber
        )YourTableName
Where   YourTableName.RowNumber>1

, если он работает, любезно пометьте как ответ

0 голосов
/ 07 июня 2019

Ваш запрос пытается удалить миллион строк для той же строки.Например, если у вас есть эти данные:

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;
0 голосов
/ 07 июня 2019

В частности, для MySQL вы можете попробовать (при условии, что строки имеют одинаковую информацию о столбцах):

ALTER IGNORE TABLE comment ADD UNIQUE INDEX idx_name (id, body);

Источник

...