积极答复者
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即:每次修改都是不同的行,则就达到效果了,即:瞬间完成
难道,不能反复更新同一行数据么,性能如此低下,还不如不用本地编译的存储过程,速度还快很多很多
答案
-
单个循环中确实不用考虑阻塞的问题,本来就是排队的
0.5秒做不到的吧?你用的是 DURABILITY = SCHEMA_AND_DATA, 也就是数据写磁盘的,除非开启延迟事务,或者在一个事务中操作
否则每一次更新都会写一次磁盘,1万次更新至少写1万次磁盘,一般的机器0.5秒多半是搞不定的
- 已建议为答案 Moonlight ShengMicrosoft contingent staff 2016年6月24日 9:22
- 已标记为答案 Herro wongMicrosoft contingent staff, Moderator 2016年6月27日 8:38
全部回复
-
Hi,
>>难道,不能反复更新同一行数据么,性能如此低下,还不如不用本地编译的存储过程,速度还快很多很多
首先你要弄清楚,不是效率问题,当你在进行修改行记录的操作同时,此条记录会被锁定,等他完成以后才能进行第二次同行记录的修改。
更新不同行就没这个问题了。
参考资料:
Regards,
Moonlight
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click HERE to participate the survey.
- 已编辑 Moonlight ShengMicrosoft contingent staff 2016年6月15日 7:59
-
单个循环中确实不用考虑阻塞的问题,本来就是排队的
0.5秒做不到的吧?你用的是 DURABILITY = SCHEMA_AND_DATA, 也就是数据写磁盘的,除非开启延迟事务,或者在一个事务中操作
否则每一次更新都会写一次磁盘,1万次更新至少写1万次磁盘,一般的机器0.5秒多半是搞不定的
- 已建议为答案 Moonlight ShengMicrosoft contingent staff 2016年6月24日 9:22
- 已标记为答案 Herro wongMicrosoft contingent staff, Moderator 2016年6月27日 8:38