sql语句优化 千万级记录 重整
帮忙优化 以下语句
目标:去除member_id和my_friend_id中非数字的所有记录
同时去除 交叉重复 以及 简单重复 的 重复值 保留max(id)该条记录。
表 test_unionpk 结构如下
id int identity pk
member_id varchar(25) with index
my_friend_id varchar(25) with index
create_date datetime default getdate()
isactive bit default 0
聚集索引为 id,其余还有几个相互column之间的非聚集索引
表的数据级别为 2千万+
SET NOCOUNT ON
declare @OperId int
, @OperFlag int
, @OperRows int
, @OperCurrent int
set @OperId=0
set @OperFlag=0
set @OperRows=10000
set @OperCurrent=9201230
while @OperFlag=0
begin
--第一步 将表中全角数字转化为半角。
begin tran
update Test_UnionPK set
member_id=replace(replace(
replace(replace(
replace(replace(
replace(replace(
replace(replace(member_id,'0',0),'1',1)
,'2',2),'3',3)
,'4',4),'5',5)
,'6',6),'7',7)
,'8',8),'9',9)
,my_friend_id=replace(replace(
replace(replace(
replace(replace(
replace(replace(
replace(replace(My_friend_id,'0',0),'1',1)
,'2',2),'3',3)
,'4',4),'5',5)
,'6',6),'7',7)
,'8',8),'9',9)
where isnumeric(member_id)=0 and isnumeric(my_friend_id)=0 and id<@OperCurrent+@OperRows and id>@OperCurrent
if @@error>0 rollback tran
-- 第二步 删除掉 表中member_id 或 my_friend_id中含非数字 的记录。
delete Test_UnionPK where id in (
select id
from Test_UnionPK where isnumeric(member_id)=0 and id<@OperCurrent+@OperRows and id>@OperCurrent
union all
select id as member_id
from Test_UnionPK where isnumeric(my_friend_id)=0 and id<@OperCurrent+@OperRows and id>@OperCurrent
)
if @@error>0 rollback tran
-- 第三步 删除掉 表中的重复记录,此重复记录包括 mid=Mid ,fid=Fid 以及 mid=Fid ,fid=Mid 这两种情况的重复。保证内部数据的唯一性。
delete Test_UnionPK where id<@OperCurrent+@OperRows and id>@OperCurrent and id not in(
select max(id) from Test_UnionPK b
where b.id<@OperCurrent+@OperRows and b.id>@OperCurrent
group by (
case when (convert(float,b.member_id)>convert(float,b.my_friend_id)
) then
b.my_Friend_id+b.member_id
else
b.member_id+b.my_Friend_id
end
)
)
If @@error>0 rollback tran
If @@RowCount=0
begin
if (select top 1 id from Test_UnionPK where id>@OperCurrent)>0 set @OperFlag=2
End
set @OperCurrent=@OperCurrent+@OperRows
end
commit tran
SET NOCOUNT Off