[英]How to make delete duplicates faster?
在一個大約1.7M行的表上,我試圖刪除重復的帖子:
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
。 我想知道是否有一些技巧可以讓這個刪除操作更快?
以下查詢對您有用。
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
如果它的工作友好地標記為答案
您的查詢正在嘗試對同一行進行大量刪除。 例如,如果您有這些數據:
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
您可以看到這將如何導致數據庫的大量工作,因為給定body
上的id
數量增加。
您可以使用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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.