在I3 32 cpu 240 32 2012R2服务器上在AWS上使用Sever 2016。
我们有导入过程,当用户登录需要更新表A时,可以将其作为select 100,000或行插入表A。
导入进程正在导致锁升级,因为它使用了5000多个锁。这将阻止用户登录。
我们可以修改表以禁用锁升级。
然而,这样做的代价是什么。
这仅仅是因为我们为锁消耗了更多的内存(我们有足够的200 it内存),就是这样吗?或者是其他的问题。
发布于 2017-09-21 02:37:41
正如Erik和大多数专家所提到的,包括Microsoft在内,他们建议减少批处理大小/更改隔离级别/重写查询,但不要禁用锁升级。
参考:
锁升级是SQL Server使用的一种优化技术,用于控制SQL Server的锁管理器中持有的锁的数量。
在SQL Server中,锁升级具有非常有用的作用,因为获取和释放数千个锁的开销会使查询的效率最大化,否则就会减慢查询的效率。锁升级还有助于最小化所需内存,以跟踪锁。SQL Server可以为锁结构动态分配的内存是有限的,因此,如果禁用锁升级并且锁内存增长到足够大,为任何查询分配额外锁的尝试可能会失败,并发生以下错误:
错误: 1204,严重性: 19,状态:1此时Server无法获得锁资源。在活动用户较少或要求系统管理员检查Server锁和内存配置时,重新运行您的语句。
数据库引擎
升级阈值
每当锁的数量大于锁定升级的内存阈值时,数据库引擎就会触发锁升级。内存阈值取决于锁配置选项的设置:
以前也有人问过类似的问题,答案没有被接受,但有一些有用的信息。
https://dba.stackexchange.com/questions/186491
复制相似问题