SQLSERVER内存表非常慢
最近测试sqlserver的内存表发现一个问题,如下:
create table product55(code int not null ,stock_total int not null,stock_now int not null,create_time smalldatetime not null,
primary key nonclustered hash(code) with(bucket_count=10000))
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
create proc porc_execute55
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
as
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')--本机编译的存储过程不支持begin tran显示的事务提交,所以遇到问题不能rollback,而只能反向写SQL了
declare @id2 int
declare @id int=1
while @id<=10000
begin
set @id2=5
update dbo.product55
set stock_now-=1
where code=@id2
set @id+=1
end
end
运行存储过程发现一个问题:
存储过程里面是循环执行10000次,按道理来说应该是瞬间完成,但是速度却非常的慢,最快一次也用了两秒钟,
最后找到一个特点:
set @id2=5
update dbo.product55
set stock_now-=1
where code=@id2
即:每次更新的都是同一行数据
如果修改为
set @id2=5+@id
update dbo.product55
set stock_now-=1
where code=@id2
即:每次修改都是不同的行,则就达到效果了,即:瞬间完成
难道,不能反复更新同一行数据么,性能如此低下,还不如不用本地编译的存储过程,速度还快很多很多