在MSSQL 2016

时间:2017-11-11 15:26:14

标签: sql sql-server performance

我在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行以上。 我用过光标,它是一样的

请帮忙。 非常感谢。

由代码修改,这是我在这里的第一篇文章,感谢你的病人

1 个答案:

答案 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。使用通配符,加速它并不是一件容易的事。