以下方案暂定,后面会试一下效果。
主要的思路是分段去重,因为直接一个语句去重太慢了。
脚本试着分段数量合理了以后,就做成程序,程序多开来处理不同的分段。
--首先按照【txt】字段建立索引 --然后下面的脚本会按照这个索引排序,分段,生成【对每个分段查询重复id】的sql语句。 --再下一步,想在程序内用dataAdapter进行删除,因为比用delete语句快一些。 --写程序前先用这个脚本试试,看看分段数量多少合适。 --总行数--大体 declare @rowCount int = ( select max(ROW_NUMBER) from ( select ROW_NUMBER() OVER(order by txt) as ROW_NUMBER from ZZ1 ) t ) --每个分段的行数 declare @FenDuanCount int = 1000 --最大的左右界限 declare @maxRightIdx int = @rowCount /@FenDuanCount +1 declare @maxLeftIdx int = @rowCount /@FenDuanCount --左右界限表 if object_id('tempdb..#tIdx') is not null drop table #tIdx select @maxLeftIdx as LeftIdx ,@maxRightIdx as RightIdx into #tIdx --求出每个左右界限 declare @curLeftIdx int = @maxLeftIdx -1 while(@curLeftIdx >=0) begin insert into #tIdx (LeftIdx,RightIdx) values (@curLeftIdx,@curLeftIdx+1) set @curLeftIdx = @curLeftIdx - 1 end --生成语句若干--用于查询重复的id select ' if object_id(''tempdb..#tFenDuan'') is not null drop table #tFenDuan --分段数据 select * into #tFenDuan from ( select ROW_NUMBER() OVER(order by txt) as ROW_NUMBER ,ID ,txt from ZZ1 ) t where ROW_NUMBER between '+Convert(varchar(100),LeftIdx*@FenDuanCount)+' and '+ convert(varchar(100),RightIdx*@FenDuanCount) + ' --重复的数据 select * FROM #tFenDuan t WHERE t.ROW_NUMBER > ( SELECT MIN(n.ROW_NUMBER) FROM #tFenDuan n WHERE t.txt = n.txt) ' from #tIdx