删除重复的行 - 无法找到决定性的答案

lau*_*ens 2 sql t-sql sql-server sql-server-2005 sql-server-2008

你马上就会想我直接去这里问我的问题,但我搜索了很多东西,没有找到一个决定性的答案.

事实:我有一张包含330万行,20列的表格.第一行是主键,因此是唯一的.

我必须删除列2到列11重复的所有行.实际上是一个基本问题,但是有很多不同的方法,而每个人最终都寻求相同的解决方案,删除重复.

我个人在考虑GROUP BY HAVING COUNT(*)> 1这是要走的路还是你的建议?

非常感谢提前!大号

Rem*_*anu 5

作为一般答案:

WITH cte AS (
  SELECT ROW_NUMBER() OVER (
      PARTITION BY <groupbyfield> ORDER BY <tiebreaker>) as rn
  FROM Table)
DELETE FROM cte
WHERE rn > 1;
Run Code Online (Sandbox Code Playgroud)

我发现它比GROUP BY ... HAVING更强大,更灵活.事实上,GROUP BY ... HAVING只给你重复,你仍然留下了在重复中选择"守护者"的"琐碎"任务.

ROW_NUMBER OVER(...)可以更好地控制如何区分重复项(决胜局)并允许"保留前三个重复项"等行为,而不仅仅是"保持1",这是一种很难做到的行为与GROUP BY ... HAVING.

问题的另一部分是如何处理3.3M行.那么,3.3M是不是真的大了,但我仍然建议分批这样做.一次删除TOP 10000,否则您将把一个巨大的事务推送到日志中,并可能压倒您的日志驱动器.

最后一个问题是这是否会令人满意.这取决于您的架构.如果ROW_NUMBER()必须扫描整个表和假脱机计数,并且您必须批量重复N次,那么它将无法执行.适当的索引会有所帮助.但我不能再说了,不知道所涉及的确切模式(聚簇索引/堆的结构,所有非聚簇索引等).