使用以下SQL脚本高效清理MSSQL重复数据:WITH DuplicateCTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Column1, Column2 ORDER BY ID) AS RowNum FROM YourTable ) DELETE FROM DuplicateCTE WHERE RowNum > 1; 执行后运行DBCC SHRINKFILE来释放空间,立即优化存储。
来源1
在SQL Server中,清理重复记录的最简单方法是使用ROW_NUMBER()窗口函数。首先创建一个CTE(公用表表达式),分区重复列,然后删除行号大于1的记录。示例代码:WITH CTE AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID) rn FROM Users) DELETE FROM CTE WHERE rn > 1; 这会保留每个Email的第一个记录,删除重复的。
来源2
优化MSSQL存储空间的关键是定期清理重复数据库记录。步骤:1. 识别重复:SELECT Column1, Column2, COUNT(*) FROM Table GROUP BY Column1, Column2 HAVING COUNT(*) > 1; 2. 删除重复:使用上面CTE方法。3. 收缩数据库:USE [DatabaseName]; DBCC SHRINKDATABASE (DatabaseName); 注意备份数据后再操作。
来源3
对于大表重复数据清理,推荐分区表或索引优化。先建唯一索引避免未来重复,然后清理:CREATE UNIQUE INDEX IX_Unique ON Table(Column1, Column2); 对于现有重复,用MERGE语句或CTE删除。完成后,更新统计信息:UPDATE STATISTICS TableName; 这样查询更快,空间更省。
来源4
轻松管理MSSQL数据,删除重复行的实用脚本:DECLARE @sql NVARCHAR(MAX) = ''; SELECT @sql = @sql + 'DELETE TOP(' + CAST(COUNT(*) - 1 AS VARCHAR) + ') t FROM Table t INNER JOIN (SELECT ID, ROW_NUMBER() OVER(PARTITION BY Col ORDER BY ID) rn FROM Table) tt ON t.ID = tt.ID WHERE rn > 1;'; EXEC sp_executesql @sql; 分批删除避免锁表。
来源5
优化存储空间:清理后使用ALTER DATABASE [DB] MODIFY FILE (NAME = N'LogicalName', SIZE = 0); 然后DBCC SHRINKFILE。结合CHECKDB检查完整性。重复清理还能提升性能,因为索引更高效。
来源6
FAQ:
Q: 清理重复数据会丢失信息吗?
A: 只要正确使用ROW_NUMBER()并指定ORDER BY,通常只删完全重复行,保留一个。
Q: 如何防止未来重复?
A: 添加唯一约束或索引,如ALTER TABLE ADD CONSTRAINT UK_Unique UNIQUE(Column1, Column2);
Q: 大表清理卡住怎么办?
A: 分批删除,或在非高峰期操作,使用NOLOCK提示。
Q: 收缩数据库有风险吗?
A: 会碎片化索引,建议只在必要时用,优先用SSMS任务维护计划。