Large SQL table 删除所有重复项

Large SQL table delete all duplicates

我有一个数据库table,里面有33265902(三千三百二十六万五千九百二)条记录。

其中大部分由重复项组成。

它给我带来了问题,因为任何查询此 table 的网站都会导致服务器负载。

这个 table 的独特之处在于两个字段,email_address 和 job_id

我的问题是什么是删除所有重复项的最佳方法,每个字段标准留下一个良好记录。

在不终止服务器的情况下执行此操作的最有效方法是什么。

这可能会有所帮助...

;WITH DuplicateData
AS(
SELECT *,DENSE_RANK() OVER(PARTITION BY email_address, job_id ORDER BY email_address, job_id ASC) [Rank]
FROM TableName
)
DELETE d
FROM DuplicateData d WHERE Rank > 1
GO

检查这个:

我更愿意使用不同的值从现有的 table 创建一个新的 table,然后删除旧的 table 然后重命名新创建的 table,因此所有步骤都将是

1. select distinct columns and insert into new_table
2. drop old_table
3. rename new_table to old_table

你可以使用限制

从 table 中删除 [WHERE条件] 限制 row_count

每 5 分钟调用一次此查询。限制为 10000 个数据或添加更多

您可以试试这个:(将 table_name 替换为您的 table 姓名)

    WITH cte AS (    
    SELECT job_id , email_address ,    
    row_number() OVER(PARTITION BY job_id , email_address order by job_id ) AS [rn]    
    FROM table_name    
 )    
 DELETE cte WHERE [rn] > 1  

另一种使用温度的方法table :

 select distinct * into ‪#‎tmptbl‬ From table_name    
 delete from table_name    
 insert into table_name    
 select * from #tmptbl drop table #tmptbl   

最有效的方法可能是在 new table 中每 table 保留一行。然后截断旧的 table 和 re-insert 值:

select t.*  -- or select all columns except seqnum
into temp_table
from (select t.*,
             row_number() over (partition by email_address, job_id order by job_id) as seqnum
      from t
     ) t
where seqnum = 1;

-- optional if you remove seqnum above
-- alter table temp_table drop column seqnum;


-- back this up first!
truncate table t;

insert to t
    select * from temp_table;

您可以删除原来的 table 并将 temp_table 重命名为 table 名称。如果这样做,请记住创建约束、索引、触发器、分区以及原始 table.

上的任何其他内容

这不会很快(您可以看到创建临时文件需要多长时间 table)。但是,删除原始 table 不需要锁定和记录。作为奖励,新的 table 应该比删除时更少碎片化。

最后我采纳了 Gordon Lindoff 的建议,似乎效果很好。

我现在的问题是我还有很多 space 我需要为 os

索回

缩小 dB 正确吗?