在 SQL Server 2016 中禁用锁升级的缺点是什么

ton*_*ony 4 sql-server

在 I3 32 cpu 240GB 2012R2 服务器上的 AWS 上使用 SQL Sever 2016。

我们有导入过程,将选择的 100,000 行或行插入表 A。用户登录时需要更新表 A。

导入过程正在导致锁升级,因为它使用了 5000 多个锁。这会阻止用户登录。

我们可以更改表以禁用锁升级。

然而,这样做的代价是什么。

仅仅是因为我们为锁消耗了更多内存(我们有 200GB 足够的内存),仅此而已吗?或者是其他任何问题。

Sql*_*ide 5

正如 Erik 所提到的,包括 Microsoft 在线书籍在内的大多数专家都建议减少批量大小/更改隔离级别/重写查询,但不要禁用锁升级。

参考:

锁升级是 SQL Server 使用的一种优化技术,用于控制 SQL Server 的锁管理器中持有的锁数量。

锁升级在 SQL Server 中起到了非常有用的作用,它可以最大限度地提高查询效率,否则会因获取和释放数千个锁开销而变慢。锁升级还有助于最小化跟踪锁所需的内存。SQL Server 可以为锁结构动态分配的内存是有限的,因此如果禁用锁升级并且锁内存增长到足够大,则尝试为任何查询分配额外的锁可能会失败并出现以下错误:

错误:1204,严重性:19,状态:1 SQL Server 此时无法获取 LOCK 资源。当活动用户较少时重新运行您的语句或要求系统管理员检查 SQL Server 锁和内存配置。

数据库引擎实例的升级阈值

只要锁数大于锁升级的内存阈值,数据库引擎就会触发锁升级。内存阈值取决于锁配置选项的设置:

  • 如果锁定选项设置为其默认设置 0,则当锁定对象使用的内存是数据库引擎使用的内存(不包括 AWE 内存)的 24% 时,就会达到锁定升级阈值。用于表示锁的数据结构大约有 100 个字节长。此阈值是动态的,因为数据库引擎会动态获取和释放内存以针对不同的工作负载进行调整。
  • 如果 locks 选项的值不是 0,则锁升级阈值是 locks 选项值的 40%(如果存在内存压力,则更小)。

之前有人问过类似的问题,答案未被接受,但有一些有用的信息。

禁用锁升级的缺点