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 正确吗?
我有一个数据库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 正确吗?