我在mssql 2016中有一个非常慢的程序,我不认为它应该那么慢。
select @count = count(UID) from TABLE1 where IsProcess = 0
while @count > 0
begin
Declare @Name nvarchar(100)
Declare @UID int
select Top 1 @UID = UID, @Name = Name from Table1 where IsProcess = 0
set @UID2 = ISNULL((select TOP 1 UID from TABLE2 where Name like N'%' + @Name + N'%'), 0)
if @UID2 = 0
begin
insert into table2 (Name) values(@Name)
set @UID2 = @@IDENTITY
end
insert into tablerelation (UID1, UID2) values(@UID, @UID2)
update TABLE1 set IsProcess = 1 where UID = @UID
select @count = count(UID) from TABLE1 where IsProcess = 0
end
table1中有大约500万行 服务器cpu小于10% 内存环绕4G(和服务器上的8G) 没有其他应用程序在服务器上运行
现在大约每秒3到4行
我认为它至少应该是每秒200行以上。 我用过光标,它是一样的
请帮忙。 非常感谢。
答案 0 :(得分:0)
为什么使用循环而不是基于集合的操作?据我所知,你想要:
insert into tablerelation (uid1, uid2)
select t1.UID, t2.UID
from Table1 t1 cross apply
(select top 1 t2.*
from table2 t2
where t2.name like N'%' + t1.Name + N'%'
) t2
where IsProcess = 0;
这应该快一点,但它不会是一个令人难以置信的加速。速度增益来自数据库操作的减少。
然而,真正的问题是join
使用like
。使用通配符,加速它并不是一件容易的事。